1

我正在从这里学习 Perl 脚本。我在创建哈希时遇到问题。代码在这里:

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"}

现在它与数组一起工作正常。但是对于 Hash 它的打印“有 -1 个键”。此外,它不会为最后打印调用的变量值打印任何内容。

4

3 回答 3

6

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

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

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

当你这样做

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

Perl 将尝试将键a和转换为数字,b即. 这将发出警告:c0

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";
于 2013-04-18T11:51:18.640 回答
3

在 Perl 中,访问散列中的元素使用与数组略有不同的语法。对散列使用花括号,对数组使用方括号:

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";

(但也许它比你现在想要的位置提前了几步)

于 2013-04-18T11:55:54.850 回答
0

$#months$months[0]引用数组而不是哈希。您可以使用花括号访问散列值$months{key}

此外,您应该use strict;使用my(). 如果你这样做了,你会得到一个@months不存在的编译器错误。

于 2013-04-18T11:53:08.740 回答