繁体   English   中英

如何在 Perl 中创建散列的 hash?

[英]How do I create a hash of hashes in Perl?

根据我目前对 Perl 中的哈希值的理解,我希望这段代码打印“hello world”。 相反,它什么也不打印。

%a=();

%b=();
$b{str} = "hello";  
$a{1}=%b;

$b=();
$b{str} = "world";
$a{2}=%b;

print "$a{1}{str}  $a{2}{str}"; 

我假设 hash 就像一个数组,那么为什么我不能让 hash 包含另一个呢?

  1. 你应该总是使用“use strict;” 在你的程序中。

  2. 使用引用和匿名哈希。

 use strict;use warnings; my %a; my %b; $b{str} = "hello"; $a{1}={%b}; %b=(); $b{str} = "world"; $a{2}={%b}; print "$a{1}{str} $a{2}{str}"; 

{%b}创建对哈希%b副本的引用。 你需要在这里复制,因为你以后将其清空。

哈希哈希很难在第一时间做到正确。 在这种情况下

$a{1} = { %b };
...
$a{2} = { %b };

会带你到你想去的地方。

有关Perl中二维数据结构的详细信息,请参阅perldoc perllol

简短回答:散列键只能与标量相关联,而不能与散列相关联。 要做你想做的事,你需要使用引用。

我建议你阅读perlreftut,而不是重新哈希(heh)如何创建多级数据结构。 perlref更完整,但一开始有点压倒性。

迈克,亚历山大是正确的答案。

也是小费。 如果您只是学习哈希perl有一个名为Data :: Dumper的模块,它可以为您打印数据结构,当您想要检查数据结构的值时,这非常方便。

use Data::Dumper;
print Dumper(\%a); 

当你打印它显示

$VAR1 = {
          '1' => {
                   'str' => 'hello'
                 },
          '2' => {
                   'str' => 'world'
                 }
        };

Perl喜欢扁平化您的数据结构。 这通常是一件好事......例如, (@options, "another option", "yet another")最终成为一个列表。

如果你的意思是在另一个结构中有一个结构,那么内部结构需要作为参考。 像这样:

%a{1} = { %b };  

大括号表示一个哈希,你正在填充来自%b的值,并返回作为引用而不是直接哈希。

你也可以说

$a{1} = \%b;   

但这使得对%b的更改也会改变$ a {1}。

我需要创建 1000 条员工记录来测试 T&A 系统。 员工记录存储在 hash 中,其中键是员工的身份证号,值是 hash 的姓名、出生日期和雇用日期等。这是如何...

# declare an empty hash
%employees = ();

# add each employee to the hash
$employees{$identity} = {gender=>$gender, forename=>$forename, surname=>$surname, dob=>$dob, doh=>$doh};

# dump the hash as CSV
foreach $identity ( keys %employees ){
    print "$identity,$employees{$identity}{forename},$employees{$identity}{surname}\n";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM