2010-02-17 65 views
2

幫助Perlers!有誰知道一個簡單的「在這裏插入代碼」的方法會在編譯時將來自外部文件的代碼放入一個包中?如何在編譯時從外部文件導入Perl代碼?

背景:

我有一個標準的PBP風格由內向外類越來越相當大。我想將代碼拆分成多個文件,但不能擴展這個類。理想情況下,我只需在編譯時將代碼插入示例模塊的「Magic JuJu」部分(請參見下文)。

我已經看過AutoLoader作爲實現這一目的的一種手段。但是,有兩件事讓我停下來。如果我能解決這些,它可能是一個近似最優解:

  1. 我不想每一個小的子拆分成一個單獨的文件;只是幾個更合理的大小的文件(使用調用者中的子存根是好的,儘管如此);和

  2. 我不想推遲編譯每個子;我希望在初次使用時彙編一些潛艇。但是,這可能不是一個交易斷路器。

我知道駝鹿提供了「角色」,我認爲這確實很好,但由於種種原因,駝鹿是不是這個項目的選擇,也不是老鼠。

我已經在「Magic JuJu」位置使用了「require q(some/file)」,但這並不能維持持久變量範圍,即外部文件中的subs不會「看見」對象屬性哈希值正確的(換句話說,把要求放在文件的頂部會有相同的效果)。我可以通過總是使用setter和getters來解決這個問題。所以這不是一個交易破壞者,但是需要一點編碼時間和執行開銷,我寧願不承擔。

最後,我不想延長班級;它已經有多重繼承。我只想要一個簡單的「在這裏插入代碼」的方法會在編譯時將代碼放入一次。

總結:

    從外部文件
  1. (必填)進口碼成包的命名空間
  2. (必需),因此只在編譯時或最小運行時開銷
  3. (必填)是否是否不延伸類
  4. (期望)榮譽插入位置範圍

示例代碼與下面的「魔術菊苣」評論:

package T; 

use strict; 
use warnings; 

########## BEGIN object persistent variables scope block ############ 
{ 
    my %Attr_Name_Env; 

    ## Constructor 'new' 
    # 
    sub new { 
    ## Get and confirm arguments 
    # 
    my $class  = shift; 
    my $href_arg = {@_}; 
    my $name_env = $href_arg->{'name_env'}; 

    ## Bless anon scalar into class 
    # 
    my $obj_new = bless anon_scalar(), $class; 
    my $idx_self = ident $obj_new; 

    # Populate object attributes 
    # 
    $Attr_Name_Env{ $idx_self } = $name_env; 

    return $obj_new; 
    } 
    ## END Constructor 'new' 

    sub DESTROY {... as you do ...} 

    sub t_get_name_env { 
    my $self  = shift; 
    my $idx_self = ident $self; 
    return $Attr_Name_Env{ $idx_self }; 
    } 

    ## insert magic juju here 

} 
########## END object persistent variables scope block ############ 

1; 

也許BEGIN塊用思樂普和eval ...

+0

你爲什麼在乎這個班有多大? – 2010-02-26 01:31:07

回答

2

您可以使用這些模塊並導入所需的零件。

use MyMod qw(wanted_sub_1 wanted_sub2); 

要訪問您的屬性哈希,你將需要修改import爲你的目標模塊。

package MyClass; 
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw(wanted_sub1 wanted_sub2); 

MyMod「則s import將創建代碼裁判已關閉在初始散列的說法,並安裝那些到MyClass命名空間。

+0

1.這些屬性是通過一個包含塊的詞彙範圍,所以它們將不可用於MyMod,除非包含的塊被刪除。這會使屬性不是真正的私有屬性,但這可能是好的。或者可以只使用訪問器來獲取屬性。 2. MyMods subs會希望使用類中的方法,特別是繼承的方法。我認爲這將符合標準的「我的$ self = shift」方法,但需要測試。 3.有點冗長,但也許是最正確的。將回報。我讀的越多,我越擔心源過濾器 – 2010-02-17 18:46:35

+0

我使用這種方法工作!對於普通的開發人員來說,導入方法有些遲鈍,並且有點冗長。但它很乾淨而且很有效,當然非常好。此外,perl -cw可以在每個模塊上工作,這非常好。 Filter :: Macro無法正常工作,並且對於此應用程序看起來有點太神奇。 – 2010-02-17 21:36:11

+1

順便說一句,看到實際的工作代碼,去這裏:http://perlmonks.org/?node_id=823764 – 2010-02-18 06:22:55

1

如果你願意住的後果,有Filter::Macro

+1

不,不是過濾器!恐怖,恐怖! – 2010-02-17 17:08:24

+0

嗨思南!謝謝! Filter :: Macro當然看起來是一個不錯的選擇。上面提到了後果。你可以跟我分享這些可能是什麼嗎? – 2010-02-17 17:11:35

+0

@Michael:您將使用源過濾器。 ;-)'Filter :: Macro'很簡單,我不認爲這會是一個問題,但是源代碼過濾器往往有點脆弱,我不知道'Filter :: Macro'是否可以安全地使用在那裏的其他模塊。 – 2010-02-17 18:31:08