2011-06-23 103 views
2

如何複製/克隆已被「祝福」的對象ref?例如,我有複製perl對象參考

my $html = HTML::PullParser->new(file => $file, text => 'text'); 

然後我想通過

$html->get_token(); 

遍歷該$html對象多次因此,我試圖做的就是複製對象第一:

use Clone qw(clone); 
my $html1 = clone($html); 
my $html2 = clone($html); 

然後我嘗試迭代新對象:

while ($html1->get_token()) { 
    # do something 
} 
while ($html2->get_token()) { 
    # do something else 
} 

但很明顯,該對象不會被複制(或者至少不會以正確的方式複製),這樣我就不會在任何一個循環中獲得任何迭代。

什麼是複製此對象的正確方法?

Thx !!

回答

3

一般來說,克隆對象需要知道其內部結構。 Clone只複製內部結構,該結構工作在普通數據結構和許多對象上,但以不可預知的方式在更復雜的對象上失敗。

在這種情況下,HTML::PullParser對象正在從文件句柄讀取。克隆副本獲得對相同文件句柄的引用,因此它們不是獨立的。

某些對象有clone方法,但HTML :: PullParser沒有。您可以創建多個對象:

my $html1 = HTML::PullParser->new(file => $file, text => 'text'); 
my $html2 = HTML::PullParser->new(file => $file, text => 'text'); 

它們將是獨立的。或者你是否試圖在解析中克隆對象?也許你可以解釋爲什麼你認爲你需要克隆解析器,我們可以建議一個更好的方法。

+0

我知道我可以按照您的建議運行多個解析。該文件很大,因此解析需要很長時間。我認爲複製,如果有一個乾淨的方式去做,會節省時間。特別是,如果我想按照您的建議在迭代中間分支,那麼創建多個新的分析器將無濟於事。 – Zhang18

+0

@ Zhang18,我建議找到一些解決不涉及克隆解析器的問題的方法。例如,您可以將由'get_token'返回的令牌保存在一個數組中,然後多次遍歷數組。如果你解釋你想要完成的事情(也許在一個新問題中),或許我們可以幫助你找到一個更好的方法。 – cjm

+0

將標記保存到數組是一種很好的想法,它以某種方式逃脫了我。非常感謝。 – Zhang18