运行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
$twig->parse( \*STDIN);
我尝试了其他一些变体,例如:
$twig->parse(\*STDIN);
$twig->parse(*STDIN);
但它们没有用,我知道它也说我的perl系统文件有问题,但我怀疑,我发现有人遇到同样的问题而且他不得不修改他的代码。
答案 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(使用xmlwf
或xmllint
或类似工具)?如果它解析,那么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
但没有更多信息,我无法再帮助你。