Существует ли идиома Perl, которая является функциональным эквивалентом вызова подпрограммы из оператора подстановки? - PullRequest
1 голос
/ 01 апреля 2010

Perl позволяет ...

$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";

1 Ответ

12 голосов
/ 01 апреля 2010

См. perldoc perlop . Вам нужно указать модификатор 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, поскольку они являются специальными переменными области видимости пакета, специально выделенными для строгого .

...