3

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

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

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

4

2 回答 2

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.

于 2012-05-03T00:13:26.017 回答
6

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

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

至:

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

因此,当打印键时,它会抓取 642 个,或哈希的新的当前键。

于 2012-05-03T00:02:57.960 回答