Arrays 在perl中查找数组中的元素数

Arrays 在perl中查找数组中的元素数,arrays,perl,count,Arrays,Perl,Count,我正在尝试编写一个Perl脚本,它将遍历XML文件并查找所有名为“className”的条目 我使用的是一个图书馆,它的名字很差 该库似乎将类似命名元素的序列表示为一个数组 我试图使用一个基本的索引循环来迭代列表中的元素。所以我试图找出数组中有多少个元素: } elsif("ARRAY" eq ref(@_[0])) { my $list = @_[0]; print "scalar($list): " . scal

我正在尝试编写一个Perl脚本,它将遍历XML文件并查找所有名为“className”的条目

我使用的是一个图书馆,它的名字很差

该库似乎将类似命名元素的序列表示为一个数组

我试图使用一个基本的索引循环来迭代列表中的元素。所以我试图找出数组中有多少个元素:

    } 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