制作哈希键

Mar*_*k F 4 perl perl-hash

我有令人费解的行为,Perl 凭空制造了一个“空”散列键。我只是从现有的哈希中获取密钥并使用相同的密钥创建一个新的哈希。尽管原始哈希中只有 15 个密钥,但新形成的哈希获得了神秘的第 16 个密钥。

这是相关代码:

DO_SOMETHING(\%Hash1, \%Hash2);

sub DO_SOMETHING {
    my %Hash3 = undef;
    my $count = 0;                                       # reset counter
    my ($Hash1Ref, $Hash2Ref) = @_;                      # grab arguments to subroutine
    my %Hash1 = %$Hash1Ref;                              # dereference hash #1
    my %Hash2 = %$Hash2Ref;                              # dereference hash #1
    my @Hash2keys = sort {$a <=> $b} keys %Hash2;        # grab keys from Hash #2
    print "Hash #2 keys = ", join (',', @Hash2keys), "\n"; # print keys in Hash # 2
    my $NumHash2keys = @Hash2keys;
    print "Number of Hash #2 keys = $NumHash2keys\n";    # print number of keys in Hash #2
    print "Building new hash (Hash #3) using keys from Hash #2\n";
    foreach my $Hash2key (@Hash2keys) {                  # iterate through Hash # 2 keys
      $count ++;                                         # count number of iterations
      $Hash3{$Hash2key} = 1                              # mirror keys from Hash #2 in a new hash (Hash #3)
    }   
  
    print "Number of Hash #2 key iterations = $count\n"; # confirm number of iterations through Hash #2 keys
    my @Hash3keys = keys %Hash3;
    print "Hash #3 keys = ", join (',', @Hash3keys), "\n";
    my $NumHash3keys = @Hash3keys;
    print "Number of Hash #3 keys = $NumHash3keys\n";
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

Hash #2 keys = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
Number of Hash #2 keys = 15
Building new hash (Hash #3) using keys from Hash #2
Number of Hash #2 key iterations = 15
Hash #3 keys = 1,10,4,12,3,13,6,2,15,14,7,,11,9,8,5
Number of Hash #3 keys = 16
Run Code Online (Sandbox Code Playgroud)

我一辈子都无法弄清楚第 16 个“null”键是从哪里来的。它似乎是在一个不可见的循环期间分配的。

too*_*lic 8

不要%Hash3用初始化undef

改变:

my %Hash3 = undef;
Run Code Online (Sandbox Code Playgroud)

到:

my %Hash3;
Run Code Online (Sandbox Code Playgroud)

如果将以下行添加到代码顶部(您应该始终这样做),您将收到一条警告消息:

use warnings;
Run Code Online (Sandbox Code Playgroud)


Tia*_*nyj 6

您的问题是 %Hash3 的初始化。

\n

您不需要设置任何内容。

\n

undef 对于引用有意义,对于散列或数组则不然

\n

试试这个例子

\n
my %foo = undef;\nuse Data::Dumper;\nprint(Dumper(\\%foo));\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
 $VAR1 = {\n      '' => undef\n    };\n
Run Code Online (Sandbox Code Playgroud)\n

发生什么事了,这;

\n
my %foo = undef;\n
Run Code Online (Sandbox Code Playgroud)\n

相当于

\n
my %foo = "" => nothing/ undefined since you don\xe2\x80\x99t specify it\n
Run Code Online (Sandbox Code Playgroud)\n

由于哈希强制键的字符串化,函数 undef 返回的未定义值变成了空字符串。

\n

尝试在代码的开头添加:

\n
use strict;\nuse warnings;\n
Run Code Online (Sandbox Code Playgroud)\n

可能会有助于发现一些错误,例如:

\n
Odd  number of elements in hash assignment at main.pl line X.\nUse of uninitialized value in list assignment at main.pl line X.\n
Run Code Online (Sandbox Code Playgroud)\n