2013-04-18 58 views
1

我正在学习here的Perl脚本。 我有问题创建哈希。代码在这里:无法在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"} 

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

+0

请[使用开始提到的教程的更新版本](http://www.perl.com/pub/2008/04 /23/a-beginners-introduction-to-perl-510.html) - 你所提到的是2000年而不是[现代](http://www.onyxneon.com/books/modern_perl/index.html )根本! – Xaerxess

+0

@Xaerxess我觉得更好理​​解! :) –

+2

@Cool_Coder:*请*不要使用该版本的教程:它已近十三年的过时了!它是在Perl 5版本8的发布之前编写的,这是一个具有里程碑意义的版本,它改变了人们使用Perl的方式。版本10和版本14也是重要的更新。我们现在版本16,版本18的发布即将开始!如果你继续学习第6版,你将会学到许多不再相关的坏习惯,并且它不会帮助你理解现代Perl代码。 – Borodin

回答

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还没有被声明,并立即停止了这个bug。

你应该使用的语法是:

print "There are " . (keys %months) . " keys\n"; 
... 
print "$i has value $months{$i}\n"; 
+0

然后我怎么知道在Hash中有多少个键,而没有将Hash的元素转换成数组,然后找到数组的大小? –

+0

@Cool_Coder对不起,我在编辑问题时接到了一个电话,说明了这一点。现在添加了。 – TLP

+0

感谢您的额外信息:) –

0

$#months$months[0]引用数组,而不是一个哈希值。您可以使用大括号$months{key}访问哈希的值。

此外,你应该use strict;my()初始化变量。如果你这样做了,你会得到一个编译器错误@months不存在。

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

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

+0

非常感谢! 我想知道你提到的语法是否快速,如果哈希大尺寸? –

+0

我建议你试试看。如果它不足以满足您的需求,请回过头再回答一个问题(尽管我怀疑这会是一个问题)。 – Zaid

+1

这取决于你的意思是'大',但这是找到一个哈希键的数量的规范方式,我从来没有注意到它需要任何时间。在'keys'的实现中,可能有一个快捷方式来计算在标量上下文中计算的关键条目,所以它实际上不会像列表上下文中那样构建一个键数组。 –