代码之家  ›  专栏  ›  技术社区  ›  Thomas L Holaday

是否有一个Perl习语,它的功能等同于从替换运算符中调用子例程?

  •  1
  • Thomas L Holaday  · 技术社区  · 14 年前

    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
    

    期望的最终结果是一种实现替换的方法,这种替换与regex匹配的内容无关。

    我必须写吗

    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 回复  |  直到 14 年前
        1
  •  12
  •   Sinan Ünür    14 年前

    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 块,因为它们是特殊的包范围变量 strict .