我想知道在我的Perl情况下哪个XML解析器的人最好.我做了很多阅读,并尝试了XML::LibXML和XML::SAX.第一个耗尽了太多的内存而第二个对我来说似乎并不那么快(即使在关闭纯perl解析器之后).
我的需求非常具体.我通过Net::SSH图书馆收到了高达50MB的大回复.我希望在收到数据时将此数据传递给XML库,以便将最少量的数据保存在内存中.然后我需要在某些标签中查找数据并对其执行任何操作,在某些情况下总和一堆值,在其他情况下只需提取值并将它们写入文件或其他任何内容.所以我需要一个可以串行工作,快速工作并使用最少内存的XML解析器.我得到的数据是最多1024字节的块,所以我希望能够做类似的事情$myparser->sendData($mynewData),然后在打开或关闭新标签时调用函数XML::SAX.
我不一定需要XPath或XSLT.
我想在perl中编写一些设置$的函数!以类似于内置perl函数的方式.当我尝试这样做时,它会抱怨"参数"无法创建管理员用户"在标量赋值中不是数字".我试过谷歌搜索这个但不幸的是谷歌不会看$!所以结果很难得到.
if(!createUser('admin')) { print $!; }
sub createUser
{
my ($user) = @_;
if($user eq "admin")
{
$! = "Cannot create admin user";
return 0;
}
#create user here
return 1;
}
Run Code Online (Sandbox Code Playgroud)
PS.我知道Try :: Tiny等,但我想保持与脚本其余部分的一致性,如果我切换到try/catch我想移动整个脚本,我还没准备好.
我试图从响应中删除"数据包号码624不匹配",所以显而易见的是尝试
cat somefile.txt | grep -v "Packet number \d+ doesn't match"
Run Code Online (Sandbox Code Playgroud)
如果我删除了-v,只是为了测试,那么它什么都不返回.所以也许命令行正在使用\d或+首先执行某些操作.所以我尝试了各种组合,比如\\d+ \\d\+ \\\\d+ \\\\d\+ [0-9]+ [0-9]\+.答对了!!最后一个有效.有人能解释一下这里发生了什么吗?如果这被命令行修改,为什么echo "\d+"还会返回\d+?
简单的问题,TCL给了我"过早的表达结束",因为三元表达式的最后一个参数是一个空字符串.如果它是其他任何东西那么它的工作正常.我可以在这里使用空字符串吗?
set y 5
set x [expr ($y > 1) ? 1 : ""]
Run Code Online (Sandbox Code Playgroud) 我正在使用perl脚本来转换文件,发现只是从stdin读取并写入stdout足以导致大量内存泄漏.它达到了大约20gig,我猜想被操作系统杀死了.这是一个显示问题的脚本.
#!/usr/bin/perl
use strict;
use warnings;
foreach my $line(<STDIN>)
{
print $line;
}
Run Code Online (Sandbox Code Playgroud)
而且我这样运行它
cat inputFile.x | perl test.pl > outputFile.x
Run Code Online (Sandbox Code Playgroud)
一旦我以每秒约0.5gig的速度运行这个记忆头.输入文件是68gig所以看起来perl永远不会释放内存.我尝试了各种各样的东西,比如undef $ line,使用ref,在foreach之外定义$ line.有没有办法强制perl释放内存?
编辑:注意,在Red Hat 6.5 64位上运行,Perl 5.10.1