Подтвердить что ты не робот

Как я могу объединить эти регулярные выражения?

Четыре очень одинаковых регулярных выражения. Я заменяю строки следующими скалярными значениями. Как это может быть более эффективным?

$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;

Спасибо.

4b9b3361

Ответ 1

Рассмотрим только использование реальной системы шаблонов. Template Toolkit, например, очень просто.

Оставляя это в стороне, вы говорите, что хотите, чтобы он был более эффективным. Влияет ли его нынешняя неэффективность на проблему? Если нет, оставьте это в покое.

Вы можете сделать все за один проход:

my %subst = (
    'receiver' => $receiver,
    'place'    => $place, 
    'position' => $position,
    'company'  => $company,
);
$line =~ s/\[(receiver|place|position|company)\]/$subst{$1}/g;

но это будет действовать иначе, если, например, $receiver является "местом".

Ответ 2

Хорошо, посмотрим, что вы хотите:

если вы хотите "оценить" значение переменной, это имя, которое вы нашли в строке, тогда вам нужно:

my $receiver = 'rcv';
my $place = 'plc';
my $position = 'pstn';
my $company = 'cmpn';
my $allVariableNames = join('|',qw(receiver place position company));
$line = '[receiver]';
$line =~ s/\[($allVariableNames)\]/'$'.$1/eg;
#$line =~ s/\[($allVariableNames)\]/eval('$'.$1)/eg; <- smarter and shorter variant
print $line,"\n"; #contain $receiver
print eval($line), "\n";   # evaluate ($receiver) => get rcv

это другой способ выполнить эту задачу, см. ysth "выше

Ответ 3

Для объединения регулярных выражений вы действительно хотите проверить Regexp:: Assemble.

Обновить: возможно, более полный пример:

my %subst = (
    'receiver' => 'rcv',
    'place'    => 'plc',
    'position' => 'pos',
    'company'  => 'cpy',
);

my $re = Regexp::Assemble->new->add(keys %subst);

my $str = "this is the receiver: [receiver] and this is the place: [place]";

$str =~ s/(?:\[($re)\])/$subst{$1}/g;

Ответ 4

Я получаю следующее:

/\[(receiver|place|position|company)\]/${"$+"}/ge;

$receiver $place $position $company должна быть глобальной переменной (наша)