清除子处理程序中的 XML Twig
Purge XML Twig inside sub handler
我正在使用 XML::Twig 解析大型 XML 文件 (60GB+) 并在 OO (Moose) 脚本中使用它。我正在使用 twig_handlers
选项在元素被读入内存后立即对其进行解析。但是,我不确定如何处理 Element 和 Twig。
在我使用 Moose(和 OO 一起)之前,我的脚本如下所示(并且有效):
my $twig = XML::Twig->new(
twig_handlers => {
$outer_tag => \&_process_tree,
}
);
$twig->parsefile($input_file);
sub _process_tree {
my ($fulltwig, $twig) = @_;
$twig->cut;
$fulltwig->purge;
# Do stuff with twig
}
现在我会这样做。
my $twig = XML::Twig->new(
twig_handlers => {
$self->outer_tag => sub {
$self->_process_tree($_);
}
}
);
$twig->parsefile($self->input_file);
sub _process_tree {
my ($self, $twig) = @_;
$twig->cut;
# Do stuff with twig
# But now the 'full twig' is not purged
}
问题是我现在发现我错过了 fulltwig
的清除。我认为 - 在第一个非 OO 版本中 - 清除将有助于节省内存:尽快摆脱 fulltwig。但是,当使用 OO 时(并且必须依赖处理程序中的显式 sub{}
),我看不到如何清除整个树枝,因为文档中说
$_ is also set to the element, so it is easy to write inline handlers
like
para => sub { $_->set_tag( 'p'); }
所以他们谈论的是您要处理的元素,而不是 fulltwig 本身。那么,如果它没有传递给子程序,我该如何删除呢?
处理程序仍然得到完整的树枝,您只是没有使用它(而是使用 $_)。
事实证明你仍然可以在树枝上调用 purge
(我通常在文档中调用 "element" 或 elt
):$_->purge
会起作用正如预期的那样,将整个树枝清除到 $_;
中的当前元素
更简洁(恕我直言)的方法是实际获取所有参数并明确清除整个树枝:
my $twig = XML::Twig->new(
twig_handlers => {
$self->outer_tag => sub {
$self->_process_tree(@_); # pass _all_ of the arguments
}
}
);
$twig->parsefile($self->input_file);
sub _process_tree {
my ($self, $full_twig, $twig) = @_; # now you see them!
$twig->cut;
# Do stuff with twig
$full_twig->purge; # now you don't
}
我正在使用 XML::Twig 解析大型 XML 文件 (60GB+) 并在 OO (Moose) 脚本中使用它。我正在使用 twig_handlers
选项在元素被读入内存后立即对其进行解析。但是,我不确定如何处理 Element 和 Twig。
在我使用 Moose(和 OO 一起)之前,我的脚本如下所示(并且有效):
my $twig = XML::Twig->new(
twig_handlers => {
$outer_tag => \&_process_tree,
}
);
$twig->parsefile($input_file);
sub _process_tree {
my ($fulltwig, $twig) = @_;
$twig->cut;
$fulltwig->purge;
# Do stuff with twig
}
现在我会这样做。
my $twig = XML::Twig->new(
twig_handlers => {
$self->outer_tag => sub {
$self->_process_tree($_);
}
}
);
$twig->parsefile($self->input_file);
sub _process_tree {
my ($self, $twig) = @_;
$twig->cut;
# Do stuff with twig
# But now the 'full twig' is not purged
}
问题是我现在发现我错过了 fulltwig
的清除。我认为 - 在第一个非 OO 版本中 - 清除将有助于节省内存:尽快摆脱 fulltwig。但是,当使用 OO 时(并且必须依赖处理程序中的显式 sub{}
),我看不到如何清除整个树枝,因为文档中说
$_ is also set to the element, so it is easy to write inline handlers like
para => sub { $_->set_tag( 'p'); }
所以他们谈论的是您要处理的元素,而不是 fulltwig 本身。那么,如果它没有传递给子程序,我该如何删除呢?
处理程序仍然得到完整的树枝,您只是没有使用它(而是使用 $_)。
事实证明你仍然可以在树枝上调用 purge
(我通常在文档中调用 "element" 或 elt
):$_->purge
会起作用正如预期的那样,将整个树枝清除到 $_;
更简洁(恕我直言)的方法是实际获取所有参数并明确清除整个树枝:
my $twig = XML::Twig->new(
twig_handlers => {
$self->outer_tag => sub {
$self->_process_tree(@_); # pass _all_ of the arguments
}
}
);
$twig->parsefile($self->input_file);
sub _process_tree {
my ($self, $full_twig, $twig) = @_; # now you see them!
$twig->cut;
# Do stuff with twig
$full_twig->purge; # now you don't
}