找出perl中数组中元素的数量

时间:2014-10-09 17:57:27

标签: arrays perl count

我正在尝试编写一个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

我在网上找到了使用标量函数和奇怪的$#表示法的参考资料,但它们都没有给我一个有意义的数字。

2 个答案:

答案 0 :(得分:4)

$list是数组引用,而不是数组。试试scalar @{$list}。另外 - 尝试XML::Twig作为XML解析的一种方式。

答案 1 :(得分:2)

不鼓励在新代码中使用XML::Simple

这来自module documentation本身的建议:

  

本模块的状态

     

不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别强烈建议使用XML::LibXML

     

此模块的主要问题是大量选项以及这些选项交互的任意方式 - 通常会产生意外结果。

     

欢迎使用包含错误修复和文档修补程序的修补程序,但不太可能添加新功能。

对于新代码,我建议您使用XML::LibXMLXML::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