你发现do
的解决方案是不坏,但可以缩短一点:
do {(my $r = $s) =~ s/from/to/; $r}
它仍然揭示了力学。您可以隐藏实现,并通过编写子例程将替代应用于列表。在大多数实现中,此函数被称为apply
,您可以从List::Gen或List::MoreUtils或其他许多模块导入。还是因为它是如此之短,只是把它写自己:
sub apply (&@) { # takes code block `&` and list `@`
my ($sub, @ret) = @_; # shallow copy of argument list
$sub->() for @ret; # apply code to each copy
wantarray ? @ret : pop @ret # list in list context, last elem in scalar
}
apply
创建参数列表中的浅表副本,然后调用它的代码块,预计将修改$_
。块的返回值不被使用。 apply
表现得像逗号,
运营商。在列表上下文中,它返回列表。在标量上下文中,它返回列表中的最后一个项目。
要使用它:
my $new = apply {s/foo/bar/} $old;
my @new = apply {s/foo/bar/} qw(foot fool fooz);
@ephemient =>链接的问题不包括使用替代作为子表达 – 2011-02-09 02:21:02
@Eric:当然可以。其中一个答案在Perl 5.13.2中提到了新的`/ r`选项(它将使其成为Perl 5.14)。 – ephemient 2011-02-09 04:25:56