对于`map`,有没有类似`last`的东西?

时间:2010-08-26 13:53:34

标签: perl

在Perl中,是否可以任意结束map执行,例如在循环中等同于last的东西?

有点像这样:

map {
    if (test == true) { last; } dosomething
} @myarray

7 个答案:

答案 0 :(得分:19)

不。您不能lastnextmap阻止grepsortmap阻止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::UtilList::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。但是我不知道那有多安全。