如何在不设置变量的情况下执行perl内联正则表达式?

Raz*_*orm 10 regex perl replace

通常,如果您希望使用正则表达式更改变量,请执行以下操作:

$string =~ s/matchCase/changeCase/; 
Run Code Online (Sandbox Code Playgroud)

但有没有办法简单地替换内联而不将其设置回变量?

我希望在这样的事情中使用它:

my $name="jason";
print "Your name without spaces is: " $name => (/\s+/''/g);
Run Code Online (Sandbox Code Playgroud)

像这样的东西,有点像PHP中的preg_replace函数.

Axe*_*man 12

针对Perl 5.14进行了修订.

从5.14开始,用/r标志返回替换,你可以这样做:

print "Your name without spaces is: [", do { $name =~ s/\s+//gr; }
    , "]\n";
Run Code Online (Sandbox Code Playgroud)

您可以使用map和词法变量.

my $name=" jason ";

print "Your name without spaces is: ["
    , ( map { my $a = $_; $a =~ s/\s+//g; $a } ( $name ))
    , "]\n";
Run Code Online (Sandbox Code Playgroud)

现在,你必须使用词法,因为$ _将别名,从而修改你的变量.

输出是

Your name without spaces is: [jason]
# but: $name still ' jason '
Run Code Online (Sandbox Code Playgroud)

不可否认,同样do会工作(也许更好)

print "Your name without spaces is: ["
    , do { my ( $a = $name ) =~ s/\s+//g; $a }
    , "]\n";
Run Code Online (Sandbox Code Playgroud)

但词汇复制仍然存在.in中的赋值my是一些人喜欢的缩写(不是我).

对于这个成语,我开发了一个我称之为的运算符filter:

sub filter (&@) { 
    my $block = shift;
    if ( wantarray ) { 
        return map { &$block; $_ } @_ ? @_ : $_;
    }
    else { 
       local $_ = shift || $_;
       $block->( $_ );
       return $_;
    }
}
Run Code Online (Sandbox Code Playgroud)

你这么称呼它:

print "Your name without spaces is: [", ( filter { s/\s+//g } $name )
    , "]\n";
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用一个词法变量而不使用`map`:`print'你的名字没有空格是:[",做{my $ a = $ name; $一个=〜S /\S + //克; $ a},"] \n"` (3认同)