Arrays 在perl中查找数组中的元素数
我正在尝试编写一个Perl脚本,它将遍历XML文件并查找所有名为“className”的条目 我使用的是一个图书馆,它的名字很差 该库似乎将类似命名元素的序列表示为一个数组 我试图使用一个基本的索引循环来迭代列表中的元素。所以我试图找出数组中有多少个元素:Arrays 在perl中查找数组中的元素数,arrays,perl,count,Arrays,Perl,Count,我正在尝试编写一个Perl脚本,它将遍历XML文件并查找所有名为“className”的条目 我使用的是一个图书馆,它的名字很差 该库似乎将类似命名元素的序列表示为一个数组 我试图使用一个基本的索引循环来迭代列表中的元素。所以我试图找出数组中有多少个元素: } elsif("ARRAY" eq ref(@_[0])) { my $list = @_[0]; print "scalar($list): " . scal
} 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
我在网上找到了使用标量函数和奇怪的
$#
符号的参考资料,但都没有给我一个有意义的数字。$list
是数组引用,而不是数组。试试scalar@{$list}
。另外-尝试XML::Twig
作为XML解析的一种方式 不鼓励在新代码中使用
这是根据委员会本身的建议:
本模块的状态
不鼓励在新代码中使用此模块。还提供了其他模块,它们提供了更直观和一致的接口。特别推荐使用XML::LibXML
该模块的主要问题是选项数量庞大,以及这些选项之间的交互方式随意,通常会产生意想不到的结果
带有bug修复和文档修复的补丁是受欢迎的,但不太可能添加新功能
对于新代码,我建议使用或
这两个模块都使用XPath来定位和修改节点,这比尝试将XML文档转换为perl数据结构(如XML::Simple
所做的)要强大得多
下面是一个如何计算假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>
标量($list)
--$list
已经是标量。您需要使用@取消对$list的引用,然后使用scalar@$list
获取长度。此外,@[0]
正在从@
获取一个元素数组切片。最好写为单个项$\u0]
。此外,$list
对于包含数组(或在本例中是数组引用)的变量来说是一个坏名称。它只会鼓励人们相信数组和列表是一回事。我开始觉得应该不鼓励在新代码中使用perl我在哪里可以了解所有不同前缀象形文字的含义和必要性?可能重复:findnodes是否只返回与xpath匹配的节点数?我在文档中找不到任何关于实际遍历文档或从节点获取属性的信息。只是对“在标量上下文中,函数将返回一个XML::LibXML::NamedNodeMap对象”的一个神秘引用,它没有任何文档。
Count is 9