关于when
块之外的given
语句,文档似乎很少。据说when
可以在设置'主题'时使用,但是当一个主题被确定为设置时?考虑以下情况:
for (@arr) {
when { }
}
似乎这是默认的,基本情况,但是我甚至无法在我的perl 5.14.2上工作 - 原来这只是另一个bash引用问题。$ perl -Mfeature=switch -e 'foreach (qw(a b c)) { when (/a/) {print 'boom'} }'
什么都不打印。我做错了什么?
for my $elem (@arr) {
when { }
}
这会有用吗? $ elem会自动成为when
使用的主题吗?
for (@arr) {
$_ = some_expression($_);
when { }
}
这会有用吗?可以在循环中设置主题吗?
此外,上述每个代码段使用foreach
代替for
时是否有任何差异?
基本上,我对主题的主题不太清楚,所以请赐教。
答案 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" } }'
关键字for
和foreach
与Perl相同。
请注意,5.18标记为given
和when
为实验性的。它不会消失,但它会改变。我解释了here上发生了什么。
不,when
不使用$elem
;它始终使用$_
。
是的,如果您愿意,可以在$_
或for
内更改given
。请注意,foreach循环将其主题别名化为正在访问的元素,因此更改另一个会更改另一个。
my @x = qw( abc def );
for (@x) { $_ = uc($_); }
say @x; # ABCDEF
答案 1 :(得分:2)
池上发现了你的实际问题。关于其他问题:
两个主题词是for
/ foreach
和given
。设置$_
(主题变量)的其他构造不被视为主题化(例如map
或grep
)。
如果使用显式循环变量运行foreach循环,则循环不被视为局部化器。因此,
for my $x (1..3) {
local $_ = $x;
say when 2;
}
将在第一次迭代时起作用,但一旦退出when
,就会死掉(不能在“局部化器之外”)。
given
的不同之处在于它没有本地化$_
,而是提供词汇$_
。也就是说,given (@a) { foo; }
类似于{ my $_ = \@a; foo; }
(我认为这可能是固定的)。