Как я могу объединить эти регулярные выражения?
Четыре очень одинаковых регулярных выражения. Я заменяю строки следующими скалярными значениями. Как это может быть более эффективным?
$line =~ s/\[(receiver)\]/$receiver/g;
$line =~ s/\[(place)\]/$place/g;
$line =~ s/\[(position)\]/$position/g;
$line =~ s/\[(company)\]/$company/g;
Спасибо.
Ответы
Ответ 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 должна быть глобальной переменной (наша)