2

我有

my $x = "whatever 123";
$x =~ s/ //g;
$x =~ s/\d/9/g;
frobnicate($x);

尽管在现实生活中它更加混乱和更大。我想做的是以函数形式执行替换,如下所示:

my $x = "whatever 123";
frobnicate(   regex_substitutions($x, s/ //g, s/\d/9/g) );

这可能看起来像是可读性的倒退,但在现实生活中这样的事情实际上会有所帮助。其目标是避免在单独的语句中使用正则表达式替换,但将其合并到表达式中。我猜有一种巧妙且易读的方法来做到这一点,长期的 perl 专家会知道。

(不仅有“不止一种方法可以做到这一点”,而且有不止一种方法可以询问任何特定的事情。如果这个问题与现有问题无关,请原谅我。)

4

2 回答 2

7

5.14 引入 /r(eturn):

frobnicate( $x =~ s/ //gr =~ s/\d/9/gr );

任何版本:

frobnicate apply { s/ //g; s/\d/9/g; } $x;

apply来自List::MoreUtils

于 2012-05-04T04:04:02.940 回答
1
#!/usr/bin/env perl

use strict; use warnings;

my $x = "whatever 123";

frobnicate(regex_substitutions($x =>
    sub { s/ //g for @_; () },
    sub { s/\d/9/g for @_; @_ },
));

sub frobnicate { print "@_\n" }

sub regex_substitutions {
    my ($x, @c) = @_;
    return map $_->($x), @c;
}
于 2012-05-04T03:22:40.233 回答