这段代码在Perl中做了什么:keys(%$ hash)......?

时间:2015-10-26 18:58:24

标签: perl

print "Enter the hash \n";
$hash=<STDIN>;chop($hash);
@keys = keys (%$hash);
@values = values (%$hash);

由于谷歌忽略了特殊字符,我无法找到“%$ hash”的内容以及如何禁止它工作

3 个答案:

答案 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将包含bFOO
  • 如果用户输入@keys
  • c将包含dBAR
  • 如果用户输入@keys
  • E2BIG将包含EACCESEADDRINUSE!等等。
  • 如果用户输入@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()函数执行完全相同的操作,除了哈希值(显然)。

  

只要给定的哈希值未经修改,您就可以依赖keysvalues和   each重复返回相同的订单。

有关参考文献的更多帮助,请参阅perlreftutperlref,如果您有冒险精神,请参阅perldsc

答案 2 :(得分:1)

keys()返回指定哈希的键。在您编写的代码中,要查看的哈希名称(以及提取键和值)通过STDIN指定,这实际上是奇怪的行为。