скопировать объект perl ref - PullRequest
2 голосов
/ 23 июня 2011

Как мне скопировать / клонировать объект ref, который был "благословен"? Например, у меня есть

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
}

Но очевидно, что объект НЕ копируется (или, по крайней мере, неправильно копируется), поэтому я не получаю никакой итерации ни в одном цикле.

Как правильно скопировать этот объект?

Thx !!

1 Ответ

3 голосов
/ 24 июня 2011

В целом, клонирование объекта требует знания его внутренней структуры. Клон просто копирует внутреннюю структуру, которая работает с простыми структурами данных и многими объектами, но не работает на более сложных объектах непредсказуемым образом.

В этом случае объект HTML :: PullParser читает из дескриптора файла. Клонированная копия получает ссылку на тот же дескриптор файла , поэтому они не являются независимыми.

Некоторые объекты имеют метод clone, а HTML :: PullParser - нет. Вы можете создать несколько объектов:

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

и они будут независимы. Или вы пытаетесь клонировать объект в процессе разбора? Возможно, вы сможете объяснить, почему вы считаете нужным клонировать синтаксический анализатор, и мы можем предложить лучший подход.

...