2015-11-04 50 views
2

在試圖重寫PERL CORE ::開放的功能,我想這個簡單的測試情況下,其工作原理:

BEGIN { 
    *CORE::GLOBAL::open = sub { 
    if (defined $_[2]) { 
    CORE::open $_[0], $_[1], $_[2]; 
    } else { 
    CORE::open $_[0], $_[1]; 
    } 
} 

爲什麼不使用@_工作?:

BEGIN { 
    *CORE::GLOBAL::open = sub { 
    CORE::open @_; 
    } 
} 

我得到:

不能使用字符串( 「3」)爲標誌裁判而 「嚴格裁判」 ......

我重寫函數的目的是打印一個堆棧跟蹤,每當打開被調用時(在上面的代碼片段中沒有顯示)。

請注意,打開被稱爲與三個參數的形式,但我想概括覆蓋方法,以便我不測試的具體數量的參數,即使我不需要知道多少預計參數。

my $fh; 
open $fh, ">", "tmp.dummy" ; 
+3

由於原型。另外,如果您想覆蓋打開,您需要在新的匿名子文件中指定正確的原型。 – Miller

+1

也應測試@_的大小,未定義。並處理更多的參數。並且不要忘記1-arg打開:) – ysth

回答

1

與大多數操作符的操作數一樣,open的操作數在標量上下文中進行評估。

相關問題