Существует ли идиома Perl, которая является функциональным эквивалентом вызова подпрограммы из оператора подстановки?
-
23-09-2019 - |
Вопрос
Перл позволяет...
$a = "fee";
$result = 1 + f($a) ; # invokes f with the argument $a
но запрещает, точнее не делает то, что я хочу...
s/((fee)|(fie)|(foe)|(foo))/f($1)/ ; # does not invoke f with the argument $1
Желаемый конечный результат — это способ осуществить замену, основанную на том, чему соответствует регулярное выражение.
Должен ли я написать
sub lala {
my $haha = shift;
return $haha . $haha;
}
my $a = "the giant says foe" ;
$a =~ m/((fee)|(fie)|(foe)|(foo))/;
my $result = lala($1);
$a =~ s/$1/$result/;
print "$a\n";
Решение
Видеть Перлдок.Вам необходимо указать e
модификатор, чтобы оценить заменяемую часть.
#!/usr/bin/perl
use strict; use warnings;
my $x = "the giant says foe" ;
$x =~ s/(f(?:ee|ie|o[eo]))/lala($1)/e;
print "$x\n";
sub lala {
my ($haha) = @_;
return "$haha$haha";
}
Выход:
C:\Temp> r the giant says foefoe
Кстати, избегайте использования $a
и $b
вне sort
блоки, поскольку они представляют собой специальные переменные области действия пакета, специально предназначенные для строгий.
Не связан с StackOverflow