有没有办法在一行中做到这一点?
my $b = &fetch();
$b =~ s/find/replace/g;
&job($b)
答案 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() );