Blocks 和 Pointy Blocks(即 { } 和 -> { })雖然也能傳入參數,但畢竟它不是副程式,沒有函式的環境(function context),也就是說:若在 block 中有 return 的話,它會由父函式立即返回,父函式因此停止執行,如下例:
sub test-in(@array, $elt) { # 若 $elt 在陣列中,則執行 return map({ say $_; return True if $elt == $_ }, @array); } my @a = 1, 2, 3; test-in(@a, 1); # 判斷陣列中是否有元素為 1 # => 結果: # 1 (因為傳入陣列中有 1,所以 map 立即停止,2 和 3 不會再做映射)
但匿名副程式則不然,sub 中的 return 只會結束 sub 本身,父函式 test-in 仍會繼續執行:
sub test-in(@array, $elt) { map(sub ($x) { say $x; return True if $elt == $x }, @array); } my @a = 1, 2, 3; test-in(@a, 1); # => 結果: # 1 # 2 # 3