Perl “地图”有类似于“最后”的词吗?

Perl “地图”有类似于“最后”的词吗?,perl,Perl,在Perl中,是否可以任意结束执行,例如循环中的某个等价物 有点像这样: map { if (test == true) { last; } dosomething } @myarray 没有。您不能从映射、grep或排序块中执行上一个、下一个等操作,因为 话虽如此,问题中的代码片段是糟糕的实践,因为在void上下文中永远不应该调用map。它们应该用于将一个列表转换为另一个列表 如果您真的必须将其内联(在ysth的评论后修改),这里有一个更好的编写方法: 否。使用顺序foreach循环

在Perl中,是否可以任意结束执行,例如循环中的某个等价物

有点像这样:

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

没有。您不能从
映射
grep
排序
块中执行
上一个
下一个
等操作,因为

话虽如此,问题中的代码片段是糟糕的实践,因为在void上下文中永远不应该调用
map
。它们应该用于将一个列表转换为另一个列表

如果您真的必须将其内联(在ysth的评论后修改),这里有一个更好的编写方法:


否。使用顺序
foreach
循环和
last
语句

自5.8.1起,在无效上下文中,未构建任何列表。 无论如何,map通常用于从另一个列表中获取列表,为原始列表的每个元素计算expr。

您可以使用跳远(
eval
/
die
对)跳出任何不直接支持它的嵌套构造:

eval { map{ die if test; dosomething } @myarray };
但正如Zaid所说,在这种情况下,使用
for
/
foreach
循环更好,因为您不使用
map
的返回值,而是希望使用for循环:

foreach ( @myarray ) { 
    last if test;
    ...
}

它做同样的事情<代码>映射用于将一个列表转换为其他列表。

您可以使用带有for语句修饰符的do块:

do {
   last if test;
   dosomething;
} for (@myarray);
尽管使用foreach块可能会更清晰,未来的代码维护者也会感谢您

foreach (@myarray) {
   last if test;
   dosomething;
}

有一些类似于地图的构造,它们完全可以执行您想要执行的操作。查看并(方便地打包为):


如果不想从列表中提取元素,请按照前面的答案使用foreach。

尝试转到标签。但我不知道这有多安全

有关相关问题,请参阅。map不会在void上下文中构造列表:?@eugene=>这是真的,但是使用
map
而不使用返回值有点误导。如果您想要操作和值的反向位置,最好使用“dosomething for…”例外情况是,出于某种原因,您需要提供dosomething列表上下文(但实际上不需要返回的列表)——这种情况很少见。for为dosomething提供了空上下文(grep将提供标量上下文),谢谢您的回答。关于“可怜的帕提斯”的事,嗯。。。“dosomething”代码旨在。。。。做something@benzebuth:我不是在说“做点什么”。您应该真正使用
map
来返回列表。正如您不应该在void上下文中使用map一样,您也不应该使用?:除非您确实需要来自任一分支的值
$\u==10&&last,打印1..15
@ysth:谢谢提醒,我总是忘记逗号运算符。有时候最好忘记这样使用逗号运算符。有人将此标记为不是答案,但我觉得这很好。这可能不是最好的答案,因为它没有得票,其他答案有很多,但这并不意味着它不是一个答案。这是一个4年前的帖子上质量很低的答案,有很多其他更好的答案。。。它对这个问题没有任何补充,应该被否决并最终删除。它可能是“低质量”,但它不是VLQ。投反对票就行了。
foreach (@myarray) {
   last if test;
   dosomething;
}
use List::MoreUtils 'first';

# get first element with a {foo} key
my $match = map { $_->{foo} eq 'some string' } @elements;