当我使用“given”时为什么会出现语法错误?

时间:2014-09-08 21:15:42

标签: perl

我试图运行以下代码:

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.

为什么?

3 个答案:

答案 0 :(得分:7)

givenwhen仅在use feature "switch";use v5.10;(或更晚的值)有效时才可用。将其中一行放在源文件的顶部。

答案 1 :(得分:5)

这是因为它默认不启用。添加以下行:

use 5.10.1;

代码

答案 2 :(得分:4)

由于Perl 5之前的5.10版本没有givenwhen关键字,因此您可以使用这些名称定义自定义函数,这当然会有不同的语法。为了避免与执行此操作的程序向后兼容,givenwhen仅在您明确要求时启用

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开发人员(当然)需要人们在非生产关键(或彻底的单位)中使用givenwhen~~ -tested!)代码并给他们反馈。如果可以的话,一定要使用它们。