【问题标题】:Finding out the number of elements in an array in perl在perl中找出数组中的元素个数
【发布时间】:2014-12-04 18:30:21
【问题描述】:

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

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

【问题讨论】:

  • scalar($list) -- $list 已经是一个标量。你需要使用@来取消引用$list,然后使用scalar @$list来获取长度。
  • 另外,@_[0] 正在从 @_ 获取一个元素数组切片。最好写成单项$_[0]
  • 另外,$list 是包含数组(或者,在本例中为数组引用)的变量的错误名称。它只是鼓励人们相信数组和列表是一回事。
  • 我开始觉得应该劝阻在新代码中使用 perl 的用户。 :) 我在哪里可以了解所有不同前缀象形文字的含义和必要性?

标签: arrays perl count


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这是来自module documentation 本身的建议:

    此模块的状态

    不鼓励在新代码中使用此模块。其他模块也可以提供更直接和一致的接口。特别推荐XML::LibXML

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

    欢迎使用带有错误修复和文档修复的补丁,但不太可能添加新功能。

    对于新代码,我建议使用XML::LibXMLXML::Twig

    这两个模块都使用 XPaths 来定位和修改节点,这比尝试将 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
    

    【讨论】:

    • findnodes 是否只返回匹配 xpath 的节点数?我在文档中找不到任何关于实际遍历文档或从节点获取属性的内容。只是对“在标量上下文中,函数将返回一个 XML::LibXML::NamedNodeMap 对象”的神秘引用。没有任何文档。
    猜你喜欢
    • 2013-03-04
    • 1970-01-01
    • 2021-08-25
    • 2022-11-01
    • 2013-06-01
    • 2011-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多