无法在Perl中创建哈希?

时间:2013-04-18 11:47:14

标签: perl hash

我正在从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键”。 此外,它不会为最后打印调用的变量值打印任何内容。

3 个答案:

答案 0 :(得分:6)

您正在哈希上使用数组语法,这根本不符合您的想法。您正在对名为@months的数组进行操作,而不是对您的哈希进行操作。例如:

print "There are $#months keys\n";

这将查找数组@months,看它是空的,并愉快地打印-1

当你这样做时

for $i (keys %months) { 
    print "$i has value $months[$i].\n"
}

Perl会尝试将密钥abc转换为数字,这些数字将为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不存在的编译器错误。