在Perl 5中可以使用'when'语句的条件是什么?

sun*_*ica 5 perl foreach for-loop

关于块when之外的语句,文档似乎很少given.据说when可以在设置'主题'时使用,但是当确定某个主题被设置时?考虑这些情况:

for (@arr) {
  when { }
}
Run Code Online (Sandbox Code Playgroud)

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

for my $elem (@arr) {
  when { }
}
Run Code Online (Sandbox Code Playgroud)

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

for (@arr) {
  $_ = some_expression($_);
  when { }
}
Run Code Online (Sandbox Code Playgroud)

这会有用吗?可以在循环中设置主题吗?

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

基本上,我对主题的主题非常不清楚,所以请赐教.

ike*_*ami 7

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

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

应该

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

我们可以切换到双引号来简化

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

我们可以进一步简化

perl -E'for (qw(a b c)) { when (/a/) { say "boom" } }'
Run Code Online (Sandbox Code Playgroud)

关键字forforeachPerl是一样的.

注意5.18标记givenwhen作为实验.它不会消失,但它会改变.我解释一下这里发生了什么.


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


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

my @x = qw( abc def );
for (@x) { $_ = uc($_); }
say @x;  # ABCDEF
Run Code Online (Sandbox Code Playgroud)