【问题标题】:copy perl object ref复制 perl 对象引用
【发布时间】:2011-09-21 12:49:02
【问题描述】:

如何复制/克隆已“祝福”的对象引用?例如,我有

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

然后我想通过

多次迭代 $html 对象
$html->get_token();

所以我尝试做的是先复制对象:

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
}

但显然该对象没有被复制(或至少没有以正确的方式复制),因此我在任何一个循环中都没有得到任何迭代。

复制这个对象的正确方法是什么?

谢谢!!

【问题讨论】:

    标签: perl object reference copy clone


    【解决方案1】:

    一般来说,克隆一个对象需要了解它的内部结构。 Clone 只是复制内部结构,它适用于普通数据结构和许多对象,但以不可预知的方式在更复杂的对象上失败。

    在这种情况下,HTML::PullParser 对象正在从文件句柄中读取。克隆的副本获得对 same 文件句柄的引用,因此它们不是独立的。

    有些对象有clone 方法,但HTML::PullParser 没有。您可以创建多个对象:

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

    他们将是独立的。或者您是否尝试在解析过程中克隆对象?也许您可以解释为什么您认为需要克隆解析器,我们可以提出更好的方法。

    【讨论】:

    • 我知道我可以按照您的建议运行多个解析。该文件很大,因此解析需要很长时间。我认为复制,如果有一个干净的方法来做,会节省时间。特别是,如果我想按照您的建议在迭代中间进行分支,那么创建多个新的解析器将无济于事。
    • @Zhang18,我建议找到一些不涉及克隆解析器的解决问题的方法。例如,您可以将get_token 返回的令牌保存在一个数组中,然后在该数组上循环数次。如果您解释了您要完成的工作(可能是在一个新问题中),也许我们可以帮助您找到更好的方法。
    • 将令牌保存到数组中是一个好主意,但不知何故让我无法理解。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 2023-04-08
    • 2018-10-13
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多