针对 Perl 5.14 进行了修订。
自 5.14 起,使用 /r 标志来返回替换,您可以这样做:
print "Your name without spaces is: [", do { $name =~ s/\s+//gr; }
, "]\n";
您可以使用map 和一个词法变量。
my $name=" jason ";
print "Your name without spaces is: ["
, ( map { my $a = $_; $a =~ s/\s+//g; $a } ( $name ))
, "]\n";
现在,您必须使用词法,因为 $_ 将 别名 从而修改您的变量。
输出是
Your name without spaces is: [jason]
# but: $name still ' jason '
诚然,do 也可以正常工作(也许更好)
print "Your name without spaces is: ["
, do { my ( $a = $name ) =~ s/\s+//g; $a }
, "]\n";
但是词法复制仍然存在。 my 中的赋值是一些人(不是我)喜欢的缩写。
对于这个成语,我开发了一个运算符,我称之为filter:
sub filter (&@) {
my $block = shift;
if ( wantarray ) {
return map { &$block; $_ } @_ ? @_ : $_;
}
else {
local $_ = shift || $_;
$block->( $_ );
return $_;
}
}
你这样称呼它:
print "Your name without spaces is: [", ( filter { s/\s+//g } $name )
, "]\n";