该perldocs文档说以下有关last:
last不能用于退出返回一个值,例如一个块eval {},sub {}或者do {},并且不应当被用来退出一个grep()或地图()操作.
为什么要在grep()或map()中避免它?我对地图特别好奇,因为它是foreach结构的替代品.文档似乎坚持在没有描述后果的情况下不做某事.
首先,意识到这一点grep并且map是透明的next,last并且redo就像if是一样.
$ perl -e'
print "A";
for (8,9) {
print "B";
print map { print "C"; next; print "D"; $_ } 1,2,3;
print "E";
}
print "F\n";
'
ABCBCF
Run Code Online (Sandbox Code Playgroud)
但是文档并没有说last 不能用于退出map,它说不应该使用它.目前尚不清楚这意味着什么.
map和grep?map和grep?我不知道.
我不认为这是#3,因为我不知道使用的任何不良副作用next,last并redo留下一个map或grep回调.
有趣的是,离开map和grep使用循环结构甚至不会发出警告,即使以相同的方式留下子.
$ perl -wE'while (1) { map { last; } 1; }'
$ perl -wE'while (1) { sub { last; }->(); }'
Exiting subroutine via last at -e line 1.
Run Code Online (Sandbox Code Playgroud)
map用于将一个列表映射到另一个列表.它当然不是替代品foreach.我经常看到像
map { print "$_\n" } @data;
Run Code Online (Sandbox Code Playgroud)
它犯了使用map它的副作用并抛弃结果列表的罪.你不会考虑使用
my $x = 99;
sqrt(my $y = $x * $x);
print $y;
Run Code Online (Sandbox Code Playgroud)
你会收到警告 出于同样的原因,你不应该map在你的意思使用for.
出于实际原因,请考虑一下
print "A";
print map { print "B"; last; print "C";} 1,2,3;
print "Z";
Run Code Online (Sandbox Code Playgroud)
OUTPUT
AB
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下last退出整个程序.通常,使用last或next在块map或grep块内部退出包含块(如果有),否则退出整个程序.这是要避免的,因此" last......不应该用于退出grep()或map()操作".