什么$ #vvv--; 做Perl中的哈希?

boo*_*gie 3 arrays perl hash key

这是整个剧本,对于某些神秘的我来说输出"642"

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

还有最后一个语句中的"键"是做什么的?谢谢你的时间.我很着急,没有足够的时间做我的研究.所以我再次感谢你的投入.

TLP*_*TLP 20

你应该总是运行脚本

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

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

Global symbol "@vvv" requires explicit package name at ...
Run Code Online (Sandbox Code Playgroud)

这意味着$#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"
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用希望哈希.

正如Friar所解释的那样,reverse是一种交换哈希键和值的方法.当在字符串上使用时,它会反转字符串,例如"foobar" - >"raboof",但是当在列表上使用时,它会反转它,因此1,2,3,4,5,6变为6,5,4,3,2,1.


小智 6

$#vvv--看起来像是评论.发生的事情是哈希,即偶数编号的元素数组,只是反向.所以它来自:

%vvv = (
    1 => 2,
    3 => 4,
    5 => 6
);
Run Code Online (Sandbox Code Playgroud)

至:

%vvv = (
    6 => 5,
    4 => 3,
    2 => 1
);
Run Code Online (Sandbox Code Playgroud)

因此,当打印密钥时,它会抓取642或散列的新的当前密钥.

  • `$ #vvv`不是注释,但它对哈希也没有任何影响. (7认同)
  • `$ #vvv - `丢弃数组`@vvv`的最后一个元素.但是数组`@vvv`和哈希`%vvv`之间没有联系 (2认同)
  • `pop(@vvv);`比`#$ vvv - ;`更有效率. (2认同)