当我运行这个:
use feature ':5.10';
$x=1;
given ($x) {
when(1) {
say '1';
$x = 2;
continue;
}
when (2) {
say '2';
}
}
这应该打印 1 和 2,但它只打印 1。我错过了什么吗?
编辑:
我添加了 $x = 2 但它仍然只打印“1”
当我运行这个:
use feature ':5.10';
$x=1;
given ($x) {
when(1) {
say '1';
$x = 2;
continue;
}
when (2) {
say '2';
}
}
这应该打印 1 和 2,但它只打印 1。我错过了什么吗?
编辑:
我添加了 $x = 2 但它仍然只打印“1”
请参阅perlsyn手册页:
given(EXPR) 将在块的词法范围内将 EXPR 的值分配给 $_
此代码输出 1 和 2:
use feature ':5.10';
$x=1;
given ($x) {
when(1) {
say '1';
$_ = 2;
continue;
}
when (2) {
say '2';
}
}
我认为您可能误解continue
了 switch 构造中失败的目的或性质。
每个when
块都以隐式中断结束,因此在given
成功匹配时退出。所做continue
的只是告诉given
块继续处理when
条件而不是突破。当它不是时,它不会强迫下一个when
条件神奇地为真。
考虑一下这个,它确实输出了两次。
use feature ':5.10';
$x=1;
given ($x) {
when(1) {
say '1';
continue;
}
when ( /1/ ) {
say '1 again';
}
}
由于 given 不是循环构造(尽管它支持 continue,在该实例中是特殊情况),因此请使用 foreach 或 for 像这样:
use feature ':5.10';
$x=1;
for ($x) {
when(1) {
say '1';
$x = 2;
continue;
}
when (2) {
say '2';
}
}
for (expression) 将 $_ 设置为表达式,并且在某些情况下,在给定/何时之前,该行为用于模拟 switch。