【发布时间】: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”还有什么作用?谢谢你的时间。我只是赶时间,没有适当的时间进行研究。再次感谢您的意见。
【问题讨论】:
这是整个脚本,出于某种神秘原因输出“642”
#!usr/bin/perl
%vvv = (1,2,3,4,5,6);
$#vvv--;
%vvv = reverse %vvv;
print keys %vvv, "\n";
最后一条语句中的“keys”还有什么作用?谢谢你的时间。我只是赶时间,没有适当的时间进行研究。再次感谢您的意见。
【问题讨论】:
您应该始终使用
运行脚本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。
【讨论】:
$#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--; 更高效。