簡體   English   中英

當我使用“given”時為什么會出現語法錯誤?

[英]Why do I get a syntax error when I use “given”?

我正在嘗試運行以下代碼:

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.

為什么?

givenwhen僅在use feature "switch";時可用use feature "switch"; use v5.10; (或某些后來的值)生效。 將其中一行放在源文件的頂部。

這是因為它默認不啟用。 添加行:

use 5.10.1;

到代碼

由於Perl 5之前的5.10版本沒有given或者when關鍵字,因此您可以使用這些名稱定義自定義函數,這當然會有不同的語法。 為了避免破壞與執行該操作的程序的向后兼容性,只有在您特別要求時才啟用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~~並給予他們反饋。 如果可以的話,一定要使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM