2015-05-25 65 views
1

我的問題是,HOPEFULLY很簡單。聲明全局perl子例程或全局別名

在Perl中,如何創建一個全局範圍的子程序,其後所有對象都可以訪問?

sub throw 
{ 
    die(shift); 
} 

似乎可以在全局範圍內工作,但之後不能被軟件包訪問。我想避免做一些在我的應用程序堆棧中的每個對象中聲明的東西。

解決方案:如何創建一個像死亡這樣的全局關鍵字的別名?

請注意:我並不在乎是否這樣做是最佳做法。儘管它們在Perl中執行相同的功能,但死亡並不是扔掉,扔掉也不會死亡。下面的語法並不意味着我想遵循O​​OP原則:

die new Exception($message); 

但是邏輯上類似於,對於拋出異常的目的,我寧願語法:

throw new Exception($message); 

非常感謝stackoverflow社區!

+1

請不要寫'新Classname'。在Perl中,'new'只是方法的名稱,而不是關鍵字,它可能會混淆解釋器。相反,使用'Exception-> new($ message)'。 –

回答

2

您可以將throw添加到UNIVERSAL包(這不是一個好的做法)。

請注意,您的throw會忽略該消息並只顯示類名。

#!/usr/bin/perl 
use warnings; 
use strict; 

{ package UNIVERSAL; 

    sub throw { die shift } 
} 

{ package MyClass; 

    sub new { bless {}, shift } 
} 

my $c = 'MyClass'->new; 
$c->throw('Ouch!'); 

請參閱Try::Tiny

+0

非常有趣!我喜歡這個主意!它絕對集中它。我認爲沒有辦法做到這一點,使我可以偶爾使用「throw new someObj()」語法? 順便說一句,我一直在尋找如何做到這一點。 Perldocs有時候有點模糊。 – steve

+0

另一個說明,我想我會在上面添加它。我的意圖是拋出引用祝福的異常對象。希望這樣做,我可以在其中存儲各種有用的信息,例如堆棧跟蹤。再次感謝! – steve

+0

@steve:'die'可以拋出異常對象。 – choroba

1

這樣的範例會如何解決您的問題?

package Exception; 

sub throw { 
    my $message = shift; 
    die Exception->new($message); 
} 

sub new { 
    # whatever 
} 

... 

然後在任何包,你可以使用正是如此它:

package SomeClass; 

sub do_something { 
    ... 
    if ($error) { 
    Exception->throw($message); 
    } 
}