我试图运行以下代码:
foreach my $k (keys %rec) {
#switch for watchlist figures
given ($k) { #line 93
# Code omitted
when ("p") { #positive breakout
if ($row{cls} > $rec{$k}) {
$email .= "positive";
} # line 104
}
when ("n") { #negative breakout
if ($row{cls} < $rec{$k}) { #line 107
但是我收到语法错误:
syntax error at check_watch.pl line 93, near ") {"
syntax error at check_watch.pl line 104, near "}"
Unterminated <> operator at check_watch.pl line 107.
为什么?
答案 0 :(得分:7)
given
和when
仅在use feature "switch";
或use v5.10;
(或更晚的值)有效时才可用。将其中一行放在源文件的顶部。
答案 1 :(得分:5)
这是因为它默认不启用。添加以下行:
use 5.10.1;
代码
答案 2 :(得分:4)
由于Perl 5之前的5.10版本没有given
或when
关键字,因此您可以使用这些名称定义自定义函数,这当然会有不同的语法。为了避免与执行此操作的程序向后兼容,given
和when
仅在您明确要求时启用
use 5.010;
或
use feature 'switch';
在词法范围的顶部,您想要使用关键字。此外,语义不断变化。例如,given
最初设计为默认使用词法$_
,但词汇$_
对于Perl 5来说非常不合适,这是他们仍在修改的问题。在某些时候,given
停止了词汇化$_
,但当然这是一个向后不兼容的变化。 when
(主要)设计为使用~~
,但该运算符在5.10中具有非常复杂的语义;它们已被修改过一次,并且有计划再次修改它们。 (这就是为什么Perl 5开发人员决定在所有新功能首次包含在开发版本中时将其标记为“实验性”的原因。)
因为它们是实验性的,要在没有警告的情况下使用它们,您还需要包括:
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
或添加5.18依赖项并使用
no warnings 'experimental::smartmatch';
,或在experimental
CPAN模块上添加依赖项并使用
use experimental 'smartmatch';
现在,另一方面,Perl 5开发人员(当然)需要人们在非生产关键(或彻底的单位)中使用given
,when
和~~
-tested!)代码并给他们反馈。如果可以的话,一定要使用它们。