在Perl中,是否可以任意结束map
执行,例如在循环中等同于last
的东西?
有点像这样:
map {
if (test == true) { last; } dosomething
} @myarray
答案 0 :(得分:19)
不。您不能last
,next
或map
阻止grep
,sort
或map
阻止they are not loops。
话虽如此,问题中的代码片段是不好的做法,因为永远不应在void上下文中调用 $_ == 10 && last, print for 1..15; # prints '123456789'
。它们应该用于将一个列表转换为另一个列表。
如果你真的必须内联它(在ysth的评论之后修改),这是一个更好的写作方式:
{{1}}
答案 1 :(得分:3)
没有。使用序数foreach
循环和last
语句。
从5.8.1开始,map is context aware - 在void上下文中,没有构造列表。 无论如何,map通常用于从另一个列表中获取列表,为原始列表的每个元素计算expr。
答案 2 :(得分:3)
您可以将do-block与for语句修饰符一起使用:
do {
last if test;
dosomething;
} for (@myarray);
虽然使用foreach块可能会更清楚,但代码的未来维护者会感谢你。
foreach (@myarray) {
last if test;
dosomething;
}
答案 3 :(得分:2)
您可以使用跳远(eval
/ die
对)来拯救任何不直接支持它的嵌套构造:
eval { map{ die if test; dosomething } @myarray };
但正如Zaid所说,在这种情况下使用for
/ foreach
循环更好,因为您没有使用map
的返回值。
答案 4 :(得分:2)
你想要一个for循环:
foreach ( @myarray ) {
last if test;
...
}
它做同样的事情。 map
用于将一个列表转换为其他列表。
答案 5 :(得分:1)
有类似地图的构造完全符合您的要求。请查看List::Util和List::MoreUtils(也方便地将其打包为List::AllUtils):
use List::MoreUtils 'first';
# get first element with a {foo} key
my $match = map { $_->{foo} eq 'some string' } @elements;
如果您不想从列表中提取元素,请按照之前的答案使用foreach。
答案 6 :(得分:-1)
尝试转到LABEL。但是我不知道那有多安全。