1

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

1 回答 1

12

请参阅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:\温度> r
巨人说敌人

顺便说一句,避免在块之外使用$a和,因为它们是特殊的包作用域变量,特别适用于strict$bsort

于 2010-04-01T00:30:44.520 回答