无法在Perl中创建哈希?

Coo*_*der 1 perl hash

我从这里学习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"}
Run Code Online (Sandbox Code Playgroud)

现在它与阵列一起工作正常.但对于哈希来说,它的印刷品是"有-1键".此外,它不会为最后打印调用的变量值打印任何内容.

TLP*_*TLP 6

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

print "There are $#months keys\n";
Run Code Online (Sandbox Code Playgroud)

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

当你这样做

for $i (keys %months) { 
    print "$i has value $months[$i].\n"
}
Run Code Online (Sandbox Code Playgroud)

Perl将尝试将键转换a,bc以数字,这将是0.这将发出警告:

Argument "a" isn't numeric in array element ...
Run Code Online (Sandbox Code Playgroud)

然后它将打印空数组元素$month[0].这将发出未定义的值警告.你没有得到这些警告,因为你没有使用

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

在你的脚本中.strict会告诉你@months还没有宣布,并立即停止了这个错误.

您应该使用的语法是:

print "There are " . (keys %months) . " keys\n";
...
print "$i has value $months{$i}\n";
Run Code Online (Sandbox Code Playgroud)