5

关于块when之外的语句的文档似乎很少。given据说when可以在设置“主题”时使用,但究竟什么时候考虑设置主题?考虑以下情况:

for (@arr) {
  when { }
}

似乎这是默认的基本情况,但我什至无法在我的 perl 5.14.2 上使用它 -$ perl -Mfeature=switch -e 'foreach (qw(a b c)) { when (/a/) {print 'boom'} }'什么也不打印。我究竟做错了什么?原来这只是另一个 bash 引用问题。

for my $elem (@arr) {
  when { }
}

这行得通吗?$elem 会自动成为when使用的主题吗?

for (@arr) {
  $_ = some_expression($_);
  when { }
}

这行得通吗?可以在循环内设置主题吗?

另外,当上述每个代码段使用foreach而不是时,有什么区别for吗?

基本上,我对主题的话题很不清楚,所以请赐教。

4

2 回答 2

7

这是一个 shell 命令构造错误。

perl -Mfeature=switch -e 'foreach (qw(a b c)) { when (/a/) {print 'boom'} }'

应该

perl -Mfeature=switch -e 'foreach (qw(a b c)) { when (/a/) {print '\''boom'\''} }'

我们可以改用双引号来简化

perl -Mfeature=switch -le'foreach (qw(a b c)) { when (/a/) {print "boom"} }'

我们可以进一步简化

perl -E'for (qw(a b c)) { when (/a/) { say "boom" } }'

关键字forandforeach与 Perl 相同。

请注意,5.18 标记givenwhen实验性的。它不会消失,但会改变。我解释这里发生了什么。


不,when不使用$elem; 它总是使用$_.


是的,你可以改变$_内部forgiven如果你愿意。请注意,foreach 循环将它们的主题别名为正在访问的元素,因此更改一个会更改另一个。

my @x = qw( abc def );
for (@x) { $_ = uc($_); }
say @x;  # ABCDEF
于 2013-07-03T20:19:57.553 回答
2

池上发现了你的实际问题。关于其他问题:

两个主题词是for/foreachgiven。设置$_(主题变量)的其他构造不被视为主题化器(例如mapgrep)。

如果您使用显式循环变量运行 foreach 循环,则该循环不被视为主题化器。所以,

for my $x (1..3) {
  local $_ = $x;
  say when 2;
}

when将适用于第一次迭代,但一旦退出,就会死掉(不能在局部化器之外“当”) 。

不同之given处在于它不 localize $_,而是提供 lexical $_。也就是说,given (@a) { foo; }类似于{ my $_ = \@a; foo; }(我认为这可能是固定的)。

于 2013-07-03T20:33:12.130 回答