【问题标题】:What does $#vvv--; do to a hash in Perl?$#vvv--; 是什么意思?对 Perl 中的哈希做些什么?
【发布时间】:2012-05-12 11:50:47
【问题描述】:

这是整个脚本,出于某种神秘原因输出“642”

#!usr/bin/perl 
%vvv = (1,2,3,4,5,6);
$#vvv--;
%vvv = reverse %vvv;
print keys %vvv, "\n";

最后一条语句中的“keys”还有什么作用?谢谢你的时间。我只是赶时间,没有适当的时间进行研究。再次感谢您的意见。

【问题讨论】:

    标签: arrays perl hash key


    【解决方案1】:

    您应该始终使用

    运行脚本
    use strict;
    use warnings;
    

    如果你有,你会注意到一个错误:

    Global symbol "@vvv" requires explicit package name at ...
    

    这意味着$#vvv 指的是数组@vvv 的最大索引,而不是哈希。在 perl 中,@vvv%vvv 是两个独立的变量。所以@vvv%vvv没有任何关系,那个操作也没用。

    编写代码的人可能一直在想的是一种截断数组的方法:

    my @array = 1 .. 6; # 1,2,3,4,5,6 but written as a range
    $#array--;          # lower maximum index by 1
    print "@array";     # prints "1 2 3 4 5"
    

    但是,希望散列不起作用。

    正如 Friar 所解释的,reverse 是一种交换散列键和值的方法。在字符串上使用时,它会反转字符串,例如"foobar" -> "raboof",但是当在列表中使用时,它会反转它,所以 1,2,3,4,5,6 变成 6,5,4,3,2,1

    【讨论】:

      【解决方案2】:

      $#vvv-- 看起来像注释。正在发生的事情是哈希,作为偶数元素数组,只是被反转了。所以它来自:

      %vvv = (
          1 => 2,
          3 => 4,
          5 => 6
      );
      

      到:

      %vvv = (
          6 => 5,
          4 => 3,
          2 => 1
      );
      

      所以当键被打印出来时,它会抓取 642 个,或者说是哈希的新的当前键。

      【讨论】:

      • $#vvv--; 正在尝试减少数组@vvv 的最后一个索引,该索引尚未定义,但没有strict,它的失败不会被注意到。
      • $#vvv 不是评论,但对哈希也没有任何影响。
      • 感谢您的回答。事实上,我只是删除了类似评论的行并得到了相同的结果。但是,数组有一个非常相似的问题,当我删除同一行时,我得到了不同的输出。这是代码.. #!usr/bin/perl @vvv = (1,2,3,4,5,6,7); $#vvv--; print $vvv[$#vvv], "\n";
      • $#vvv-- 丢弃数组@vvv 的最后一个元素。但是数组@vvv和哈希%vvv之间没有联系
      • pop(@vvv);#$vvv--; 更高效。
      猜你喜欢
      • 1970-01-01
      • 2018-03-05
      • 1970-01-01
      • 2012-01-28
      • 2014-02-24
      • 2010-12-28
      • 2014-08-15
      • 2020-05-21
      • 1970-01-01
      相关资源
      最近更新 更多