2013-04-18 22 views
1

在添加TO_JSON方法(轉換經由JSON.pm一個幸福的引用)到CGI ::曲奇如果我這樣做:非常奇怪的perl語法錯誤添加TO_JSON方法打包

package CGI::Cookie; 
sub TO_JSON { 
    return { 
     map { name => $_->name, 
       value => $_->value, 
       domain => $_->domain, 
       path => $_->path, 
       expires => $_->expires } 
      shift 
    } 
} 

語法錯誤在XXX.pm線76,在XXX.pm 線77附近的「移位」語法錯誤,接近「}」編譯失敗在(EVAL 50)第3行

要求,但如果我這樣做:

package CGI::Cookie; 
sub TO_JSON { 
    return { 
     map { ''.'name' => $_->name, 
       value => $_->value, 
       domain => $_->domain, 
       path => $_->path, 
       expires => $_->expires } 
      shift 
    } 
} 

它的工作

不能爲我的生活找出原因。也只是引用「名稱」沒有幫助。我必須連接一個空字符串才能工作。

我很迷惑。

回答

2

當涉及到塊和匿名hashrefs時,Perl語法有點模棱兩可。通過{; ... }

通過+{ ... }

  • 碼塊

    • Hashref強制塊map後是一個代碼塊解決問題:當該Perl不能正確地猜測,你可以強制正確的解釋。之前它認爲該塊是匿名散列,並且在shiftmap可以是map EXPR, LIST的形式之前沒有逗號,並且hashref是有效的表達式。


      子使用不當使用map一個元素分配給$_。這將更好地被寫成:

      sub TO_JSON { 
          my $o = shift; # my $_ should work as well, but that is beside the point 
          return +{ 
           name => $o->name, 
           value => $o->value, 
           domain => $o->domain, 
           path => $o->path, 
           expires => $o->expires, 
          }; 
      } 
      

      但它可能是縮寫爲

      sub TO_JSON { 
          my $o = shift; 
          return +{ 
           map { $_ => $o->$_() } qw/name value domain path expires/ 
          }; 
      } 
      
  • +0

    感謝。非常奇怪,儘管由於codeblock應該是map()的首選參數,所以我認爲這將是Perl會首先假設的。 這也適用: 包CGI :: Cookie; 子TO_JSON { 返回{ 地圖{;命名=> $ _->名, 值=> $ _->值, 域=> $ _->域, 路徑=> $ _->路徑, expires => $ _-> expires} shift } } –