2012-03-22 54 views
1

調用子參考時,同事的錯字引發了這個奇怪的語法問題。如果我調用沒有取消引用箭頭的子引用,perl將以Not a GLOB reference來死亡。但是,如果subref被稱爲一個祝福對象的方法,它運行良好。使用`不是GLOB參考'調用子參數時發生錯字

這與globs有什麼關係?爲什麼該方法調用工作?

use 5.12.0; 
use Try::Tiny; 

my $f = sub { 'sub ref' }; 
my $obj = bless({}, 'Blessed'); 

try { 
    say $f($obj); # should be $f->(); 
} catch { 
    say "ERROR: $_"; 
}; 

say $obj->$f(); 

輸出:

C:\code>perl dispatch.pl 
ERROR: Not a GLOB reference at dispatch.pl line 8. 

sub ref 

回答

4

say,如print,接受可選的文件句柄/類型團來直接輸出到,例如:

my $f = \*STDERR; 
say $f ("This goes to stderr."); 

我不知道到現在爲止你可以在子程序引用上做一個方法調用,但是肯定的是,perlobj手冊頁指出:

如果箭頭的右側是含有至 子程序的參考標量,則這相當於與類名或對象上的箭頭的左側作爲其 第一個參數調用引用子程序 直接。沒有進行查找,也沒有要求在與箭頭左側的類名稱或對象相關的任何包中定義子例程 。