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

时间:2013-07-03 20:18:29

标签: perl for-loop foreach

关于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时是否有任何差异?

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

2 个答案:

答案 0 :(得分: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" } }'

关键字forforeach与Perl相同。

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


不,when不使用$elem;它始终使用$_


是的,如果您愿意,可以在$_for内更改given。请注意,foreach循环将其主题别名化为正在访问的元素,因此更改另一个会更改另一个。

my @x = qw( abc def );
for (@x) { $_ = uc($_); }
say @x;  # ABCDEF

答案 1 :(得分:2)

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

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

如果使用显式循环变量运行foreach循环,则循环不被视为局部化器。因此,

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

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

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