Perl死在大XML文件上,使用STDIN
我在运行perl脚本时出现以下错误:Perl死在大XML文件上,使用STDIN,xml,macos,perl,debugging,unix,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. 这里是第8行,位于mysscript.pl $twig->parse( \*STDIN); 我尝试了其他一些变化,如: $twig->p
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.
这里是第8行,位于mysscript.pl
$twig->parse( \*STDIN);
我尝试了其他一些变化,如:
$twig->parse(\*STDIN);
$twig->parse(*STDIN);
但是它们不起作用,我知道它还说我的perl系统文件有问题,但我怀疑,我发现有人有同样的问题,他不得不修复他的代码。这是一个XML错误,不是perl错误。它确实表明您的XML已损坏。 您可以通过解析中的
eval
捕获它
但事实上,仔细想想,问题可能是你用你的parse
只阅读了STDIN
的第一行。
尝试添加:
{
local $/;
$twig -> parse ( <STDIN> );
}
{
本地$/;
$twig->parse();
}
但是,对于大型XML文件,我非常喜欢XML::Twig
,因为它有一个purge
方法,可以让您丢弃已经处理过的XML。XML的缺点之一是它的内存占用大约是原始文件大小的10倍。因此,如果文件特别大,则可能内存不足 $twig->parse(\*STDIN)
是正确的语法,因此这不是导致错误的原因
所以看起来要么XML有问题,要么某个地方有bug。您是否尝试过检查XML(使用
xmlwf
或xmllint
或类似工具)?如果它进行解析,那么XML的编码是什么?如果是UTF-16,那么这可能就是问题所在,libexpat
(XML::Twig所基于的)似乎在这种编码上有问题。XML::Twig模块只有两种读取要解析的XML的基本方法:
,它需要一个包含XML数据的字符串作为参数parse
,它需要一个字符串来指定要读取的XML文件的名称(和路径)parsefile
$twig->parse(\*STDIN)
或$twig->parse(*STDIN)
,那么您将传递字符串GLOB(0x44b574)
和*main::STDIN
,这显然是无效的XML
我想你可以从那里知道你的电话应该是什么样子。如果要在命令行上将文件名作为参数传递,则最简单的解决方案是写入
$twig->parsefile(shift)
但是如果没有更多的信息,我无法进一步帮助您。检查我的编辑-我想这是因为您只阅读了XML的第一行。你的文件到底有多大?我不认为这是问题所在,STDIN应该用这个语法正确解析。你的修复是正确的,因为它将读取整个文件并将XML数据传递给
parse
。然而,问题并不是只有第一行被读,因为原始问题中没有任何内容被读。当需要XML数据字符串时,正在传递文件句柄。让XML::Twig
解析文件的最佳方法是将文件名传递给parsefile
。没有接受文件句柄的方法。@mirod:不。不,不应该。OP代码中的语法完全错误。但是Sobrique的修正是正确的,尽管这是一个基于错误原因的非最佳解决方案。@mirod:我道歉并已被更正:parse
方法可以使用(引用)文件句柄,因此$twig->parse(\*STDIN)
应该可以。$twig->parse(*STDIN)
是错误的。parse
方法需要包含有效XML文档的字符串,而不是文件句柄。通常,可以使用*STDIN
或\*STDIN
将文件句柄作为参数传递,但在某些情况下,仅接受其中一种,后者是最常见的。Oops!那些小精灵吃了我的反斜杠(事实上,我打了它,但它没有出现在帖子里)。我修复了它。我道歉并已被更正:parse
方法可以使用(引用)文件句柄。实际上,它支持为parse
方法提供文件句柄。下面是perldoc的相关摘录:“$source参数应该是一个包含整个XML文档的字符串,或者应该是一个开放的IO::Handle(又名filehandle)。@SamChoukri:谢谢你纠正我的错误。我想我忽略了这一点,因为文档中没有传递文件句柄的示例。