gpt4 book ai didi

perl - $twig->purge 给出空文件

转载 作者:行者123 更新时间:2023-12-01 11:34:47 27 4
gpt4 key购买 nike

我可能会问一个基本问题,但它让我很烦。

以下是我的代码片段

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;


my $twig = new XML::Twig( twig_handlers => { TRADE => \&TRADE } );

$twig->parsefile('1510.xml');

$twig->set_pretty_print('indented');

$twig->print_to_file('out.xml');

sub TRADE {
my ( $twig, $TRADE ) = @_;
#added delete in place of cut
$TRADE->cut($TRADE) unless
$TRADE->att('origin') eq "COMPUTER";
}

这按预期工作。它为我提供了所有“来源”等于“计算机”的交易。

但我需要处理跨越 1 GB 的 XML 文件。在那种情况下,它会消耗大量内存,因此会出现“段错误”。

因此,为了解决这个问题,我正在尝试实现 XML::Twig 的“清除”概念

因此我将代码修改为:

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;


my $twig = new XML::Twig( twig_handlers => { TRADE => \&TRADE } );

$twig->parsefile('1510.xml');

$twig->set_pretty_print('indented');

$twig->print_to_file('out.xml');

sub TRADE {
my ( $twig, $TRADE ) = @_;
#added delete in place of cut
$TRADE->cut($TRADE) unless
$TRADE->att('origin') eq "COMPUTER";

$twig->purge;
}

这是给我空文件。我正在尝试刷新那些为了有效使用内存而使用的 Twig 。

我不知道为什么它给我空白的输出文件。

示例 XML:

<TRADEEXT>
<TRADE origin = 'COMPUTER'/>
<TRADE origin = 'COMP'/>
<TRADE origin = 'COMPP'/>
</TRADEEXT>

输出文件:

<TRADEEXT>
<TRADE origin = 'COMPUTER'/>
</TRADEEXT>

最佳答案

你可能应该使用flush(到一个filehanlde)而不是purge:flush输出到目前为止已经解析的 Twig 并释放内存,而 purge 仅释放内存。

也就是说,如果您只想删除没有适当属性的 TRADE 元素,您可以这样做:

#!/usr/bin/perl

use strict;
use warnings;
use XML::Twig;

open( my $out, '>:utf8', "out.xml") or die "cannot create output file out.xml: $!";

my $twig = XML::Twig->new( pretty_print => 'indented',
twig_roots => { 'TRADE[@origin != "COMPUTER"]'
=> sub { $_->delete; }
},
twig_print_outside_roots => $out,
)

->parsefile('1510.xml');

这会在文件中留下一些额外的空行,您可以稍后删除它们。 twig_roots 处理程序会为您需要删除的所有元素触发并删除它们,而 twig_print_outside_roots 选项会导致所有其他元素按原样打印。

关于perl - $twig->purge 给出空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28413001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com