Perl使用STDIN在大XML文件上死掉

时间:2014-11-22 20:15:28

标签: xml macos perl debugging unix

运行perl脚本时出现此错误:

unclosed token at line 1, column 0, byte 0 at /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level/XML/Parser.pm line 187.

at mysscript.pl line 8.

mysscript.pl

的第8行
$twig->parse( \*STDIN);

我尝试了其他一些变体,例如:

$twig->parse(\*STDIN);
$twig->parse(*STDIN);

但它们没有用,我知道它也说我的perl系统文件有问题,但我怀疑,我发现有人遇到同样的问题而且他不得不修改他的代码。

3 个答案:

答案 0 :(得分:1)

这是一个XML错误,而不是Perl错误。它确实表明你已经破解了XML。 您可以通过eval在解析中捕获它。

但实际上 - 考虑一下 - 问题可能是你只用你的STDIN阅读parse的第一行。 尝试添加:

{ 
    local $/;
    $twig -> parse ( <STDIN> );
}

但是,对于大型XML文件,我非常喜欢XML::Twig,因为它有一个purge方法,可以让您丢弃已经处理过的XML。 XML的缺点之一是它的内存占用量大约是原始文件大小的10倍。如果您的文件特别大,那么您的内存可能会耗尽。

答案 1 :(得分:0)

$twig->parse( \*STDIN)是正确的语法,因此不是导致错误的原因。

所以看起来您的XML存在问题,或者某处存在错误。您是否尝试检查XML(使用xmlwfxmllint或类似工具)?如果它解析,那么XML的编码是什么?如果它是UTF-16,则可能是问题,libexpat(XML :: Twig所基于的)似乎在使用此编码时出现问题。

答案 2 :(得分:0)

XML::Twig模块只有两种基本方法来读取要解析的XML:

  • parse,它要求包含XML数据的字符串作为参数

  • parsefile,需要字符串指定要读取的XML文件的名称(和路径)

没有传递打开文件句柄的选项,如果你写$twig->parse(\*STDIN)$twig->parse(*STDIN),那么你将传递(类似)字符串GLOB(0x44b574)和{{1}分别,这显然不是有效的XML。

我认为你可以从那里找出你的电话应该是什么样子。如果要将文件名作为参数传递给命令行,那么最简单的解决方案是编写

*main::STDIN

但没有更多信息,我无法再帮助你。