查找和替换不存储变量

时间:2010-10-23 14:55:16

标签: regex perl

有没有办法在一行中做到这一点?

my $b = &fetch();
$b =~ s/find/replace/g;
&job($b)

3 个答案:

答案 0 :(得分:4)

如果您询问是否必须通过标量变量进行替换,答案是肯定的。这是因为替换的结果必须存储在某处。此外,替换不返回使用的变量,它返回所做的替换次数。因此,您无法在函数调用中内联它(即& job($ b = ~s / find / replace / g))。

答案 1 :(得分:4)

当然,使用do {}块:

use strict;
use warnings;

sub fetch { 'please find me' }
sub job   { print @_, "\n"   }

job( do { $_ = fetch(); s/find/replace/g; $_ } );

原因是在Perl中你不能fetch() =~ s/find/replace/;
Can't modify non-lvalue subroutine call in substitution (s///) at ...

Perl 5.14将引入/r标志(这使得正则表达式返回带有替换的字符串而不是替换的数量)并将上面的内容减少为:

job( do { $_ = fetch(); s/find/replace/gr; } );

已修改感谢FM:可以将上述内容缩短为:

job( map { s/find/replace/g; $_ } fetch() );

一旦Perl 5.14出局,它可以缩短为:

job( map { s/find/replace/gr } fetch() );

答案 2 :(得分:0)

for (fetch() . '') {   # append with '' to make sure it is a non-constant value
    s/find/replace/g;
    job($_)
}

或使用其中一个列表模块中的apply

use List::Gen qw/apply/;

job( apply {s/find/replace/g} fetch() );