你發現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