这是整个剧本,对我来说一些神秘的原因输出“642”
#!usr/bin/perl
%vvv = (1,2,3,4,5,6);
$#vvv--;
%vvv = reverse %vvv;
print keys %vvv, "\n";
最后一个声明中的“键”是做什么的?谢谢你的时间。我很着急,没有足够的时间做我的研究。所以我再次感谢你的投入。
答案 0 :(得分:20)
您应始终使用
运行脚本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
。
答案 1 :(得分:6)
$#vvv--看起来像是评论。发生的事情是哈希,即偶数编号的元素数组,只是反向。所以它来自:
%vvv = (
1 => 2,
3 => 4,
5 => 6
);
为:
%vvv = (
6 => 5,
4 => 3,
2 => 1
);
因此,当打印密钥时,它会抓取642或散列的新的当前密钥。