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或散列的新的当前密钥.