我正在尝试编写一个perl脚本,它将遍历一个xml文件,并找到名为'className'的所有条目。
我正在使用XML::Simple库,这个库的名字很差。
该库似乎将类似命名的元素序列表示为数组。
我试图使用基本的索引循环迭代列表中的元素。所以我试图找出数组中有多少元素:
} elsif("ARRAY" eq ref(@_[0])) {
my $list = @_[0];
print "scalar($list): " . scalar($list) . "\n";
print "\$#list: " . $#list . "\n";
print "\n";
}
以下是我的代码输出:
scalar(ARRAY(0x600845398)): ARRAY(0x600845398)
$#list: -1
我在网上找到了使用标量函数和奇怪的$#表示法的参考资料,但它们都没有给我一个有意义的数字。
答案 0 :(得分:4)
$list
是数组引用,而不是数组。试试scalar @{$list}
。另外 - 尝试XML::Twig
作为XML解析的一种方式。
答案 1 :(得分:2)
不鼓励在新代码中使用XML::Simple
。
这来自module documentation本身的建议:
本模块的状态
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强烈建议使用
XML::LibXML
。此模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果。
欢迎使用包含错误修复和文档修补程序的修补程序,但不太可能添加新功能。
对于新代码,我建议您使用XML::LibXML
或XML::Twig
。
这两个模块都使用XPath来定位和修改节点,这比尝试将XML文档转换为像XML::Simple
这样的perl数据结构要强大得多。
以下是如何计算虚假XML文档中名为className
的节点数的示例:
use strict;
use warnings;
use XML::LibXML;
my $xml = XML::LibXML->load_xml( IO => \*DATA );
my @className = $xml->findnodes('//className');
print "Count is " . @className . "\n";
__DATA__`
<root>
<foo>
<className id="one" />
<className id="two" />
<className id="three" />
</foo>
<bar>
<className id="four" />
<className id="five" />
<className id="six" />
</bar>
<baz>
<biz>
<className id="seven" />
<className id="eight" />
<className id="nine" />
</biz>
</baz>
</root>
输出:
Count is 9