幫助Perlers!有誰知道一個簡單的「在這裏插入代碼」的方法會在編譯時將來自外部文件的代碼放入一個包中?如何在編譯時從外部文件導入Perl代碼?
背景:
我有一個標準的PBP風格由內向外類越來越相當大。我想將代碼拆分成多個文件,但不能擴展這個類。理想情況下,我只需在編譯時將代碼插入示例模塊的「Magic JuJu」部分(請參見下文)。
我已經看過AutoLoader作爲實現這一目的的一種手段。但是,有兩件事讓我停下來。如果我能解決這些,它可能是一個近似最優解:
我不想每一個小的子拆分成一個單獨的文件;只是幾個更合理的大小的文件(使用調用者中的子存根是好的,儘管如此);和
我不想推遲編譯每個子;我希望在初次使用時彙編一些潛艇。但是,這可能不是一個交易斷路器。
我知道駝鹿提供了「角色」,我認爲這確實很好,但由於種種原因,駝鹿是不是這個項目的選擇,也不是老鼠。
我已經在「Magic JuJu」位置使用了「require q(some/file)」,但這並不能維持持久變量範圍,即外部文件中的subs不會「看見」對象屬性哈希值正確的(換句話說,把要求放在文件的頂部會有相同的效果)。我可以通過總是使用setter和getters來解決這個問題。所以這不是一個交易破壞者,但是需要一點編碼時間和執行開銷,我寧願不承擔。
最後,我不想延長班級;它已經有多重繼承。我只想要一個簡單的「在這裏插入代碼」的方法會在編譯時將代碼放入一次。
總結:
-
從外部文件
- (必填)進口碼成包的命名空間
- (必需),因此只在編譯時或最小運行時開銷
- (必填)是否是否不延伸類
- (期望)榮譽插入位置範圍
示例代碼與下面的「魔術菊苣」評論:
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 ...
你爲什麼在乎這個班有多大? – 2010-02-26 01:31:07