print "Enter the hash \n";
$hash=<STDIN>;chop($hash);
@keys = keys (%$hash);
@values = values (%$hash);
由于谷歌忽略了特殊字符,我无法找到“%$ hash”的内容以及如何禁止它工作
答案 0 :(得分:3)
keys(%$hash)
返回$hash
中值引用的哈希的键。哈希是一种关联数组,它(或多或少)表示由字符串(称为“键”)而不是数字索引的数组。
在这种特殊情况下,$hash
包含一个字符串。当使用字符串作为引用时,取消引用它将访问名称与字符串匹配的包变量。
如果完整的程序是
%FOO = ( a=>1, b=>2 );
%BAR = ( c=>3, d=>4 );
print "Enter the hash \n";
$hash=<STDIN>;chop($hash);
@keys = keys(%$hash);
然后,
@keys
,a
将包含b
和FOO
。@keys
,c
将包含d
和BAR
。@keys
,E2BIG
将包含EACCES
,EADDRINUSE
,!
等等。@keys
,INC
可以包含路径。@keys
将为空。(键以任意顺序返回。)
最后三个案件肯定是无意的。这就是发布的代码是糟糕的代码的原因。这就是代码应该是:
use strict; # Always use these as they
use warnings 'all'; # find/prevent numerous errors.
my %FOO = ( a=>1, b=>2 );
my %BAR = ( c=>3, d=>4 );
my %inputs = ( FOO => \%FOO, BAR => \%BAR );
print "Enter the name of a hash: ";
my $hash_name = <STDIN>;
chomp($hash_name);
my $hash = $inputs{$hash_name}
or die("No such hash\n");
my @keys = keys(%$hash);
...
答案 1 :(得分:1)
您发布的代码是荒谬的,但 应该做的是取消引用哈希引用,前提是您的标量$hash
中存储了有效的哈希引用(您不需要“T)。
例如:
use strict;
use warnings;
use Data::Dump;
my $href = {
foo => 'bar',
bat => 'baz',
};
dd(keys(%$href)); # ("bat", "foo")
dd(values(%$href)); # ("baz", "bar")
keys()
函数将返回一个包含散列的所有键的列表。
返回的值是散列中原始键的副本,所以 修改它们不会影响原始哈希。
values()
函数执行完全相同的操作,除了哈希值(显然)。
只要给定的哈希值未经修改,您就可以依赖
keys
,values
和each
重复返回相同的订单。
有关参考文献的更多帮助,请参阅perlreftut,perlref,如果您有冒险精神,请参阅perldsc。
答案 2 :(得分:1)
keys()
返回指定哈希的键。在您编写的代码中,要查看的哈希名称(以及提取键和值)通过STDIN
指定,这实际上是奇怪的行为。