无法在Perl中创建哈希?
我正在学习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个键”。 此外,它不打印任何内容在最后打印调用的变量值。
您正在使用散列上的数组语法,它不会完成您的想法。而不是在你的哈希上运行,你正在操作一个名为@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
还没有被声明,并立即停止了这个bug。
你应该使用的语法是:
print "There are " . (keys %months) . " keys\n";
...
print "$i has value $months{$i}\n";
然后我怎么知道在Hash中有多少个键,而没有将Hash的元素转换成数组,然后找到数组的大小? –
@Cool_Coder对不起,我在编辑问题时接到了一个电话,说明了这一点。现在添加了。 – TLP
感谢您的额外信息:) –
$#months
和$months[0]
引用数组,而不是一个哈希值。您可以使用大括号$months{key}
访问哈希的值。
此外,你应该use strict;
和my()
初始化变量。如果你这样做了,你会得到一个编译器错误@months
不存在。
在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比你现在想要的位置提前几步)
非常感谢! 我想知道你提到的语法是否快速,如果哈希大尺寸? –
我建议你试试看。如果它不足以满足您的需求,请回过头再回答一个问题(尽管我怀疑这会是一个问题)。 – Zaid
这取决于你的意思是'大',但这是找到一个哈希键的数量的规范方式,我从来没有注意到它需要任何时间。在'keys'的实现中,可能有一个快捷方式来计算在标量上下文中计算的关键条目,所以它实际上不会像列表上下文中那样构建一个键数组。 –
请[使用开始提到的教程的更新版本](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
@Xaerxess我觉得更好理解! :) –
@Cool_Coder:*请*不要使用该版本的教程:它已近十三年的过时了!它是在Perl 5版本8的发布之前编写的,这是一个具有里程碑意义的版本,它改变了人们使用Perl的方式。版本10和版本14也是重要的更新。我们现在版本16,版本18的发布即将开始!如果你继续学习第6版,你将会学到许多不再相关的坏习惯,并且它不会帮助你理解现代Perl代码。 – Borodin