Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl死在大XML文件上,使用STDIN_Xml_Macos_Perl_Debugging_Unix - Fatal编程技术网

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

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

我在运行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->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的基本方法:

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

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

没有传递打开文件句柄的选项,如果您分别编写
$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:谢谢你纠正我的错误。我想我忽略了这一点,因为文档中没有传递文件句柄的示例。