我正在从here学习Perl脚本。 我在创建Hash时遇到问题。代码在这里:
print "Hello World!\n";
@days = ("1", "2");
print "There are $#days days\n";
print "1 is $days[0]\n";
%months = ("a" => 1, "b" => 2, "c" => 3);
print "There are $#months keys\n";
print "a is $months[0]\n";
for $i (keys %months)
{ print "$i has value $months[$i].\n"}
现在它与数组一起工作正常。 但对于哈希来说,它的印刷品是“有-1键”。 此外,它不会为最后打印调用的变量值打印任何内容。
答案 0 :(得分:6)
您正在哈希上使用数组语法,这根本不符合您的想法。您正在对名为@months
的数组进行操作,而不是对您的哈希进行操作。例如:
print "There are $#months keys\n";
这将查找数组@months
,看它是空的,并愉快地打印-1
。
当你这样做时
for $i (keys %months) {
print "$i has value $months[$i].\n"
}
Perl会尝试将密钥a
,b
和c
转换为数字,这些数字将为0
。这将发出警告:
Argument "a" isn't numeric in array element ...
然后它将打印空数组元素$month[0]
。这将发出未定义的值警告。您没有收到这些警告,因为您没有使用
use strict;
use warnings;
在你的脚本中。 strict
会告诉您@months
尚未宣布,并立即停止此错误。
您应该使用的语法是:
print "There are " . (keys %months) . " keys\n";
...
print "$i has value $months{$i}\n";
答案 1 :(得分:3)
在Perl中,访问散列中的元素使用与数组略有不同的语法。使用curlies作为哈希,使用方括号作为数组:
print "a is $months{a}\n"; # "a is 1"
$#months
是另一种说'@months的最后一个索引'的方式,当你真正想要的是计算%months
中的键数时:
printf "There are %d keys\n", scalar keys %months;
如果您坚持print
而不是printf
:
print "There are $#{[keys %months]} keys\n";
(但也许比你现在想要的地方提前几步)
答案 2 :(得分:0)
$#months
和$months[0]
引用数组而不是哈希。您可以使用花括号$months{key}
来访问哈希值。
此外,您应use strict;
并使用my()
初始化变量。如果您已经这样做了,那么您将遇到@months
不存在的编译器错误。