如何在Perl中创建散列?

如何在Perl中创建散列?,perl,hash,perl-data-structures,Perl,Hash,Perl Data Structures,根据我目前对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}"; 我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢 您应该在程序中始终使用“use strict;” 使用引用和匿名哈希 use strict;u

根据我目前对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}"; 
我假设一个散列就像一个数组,那么为什么我不能让一个散列包含另一个呢

  • 您应该在程序中始终使用“use strict;”

  • 使用引用和匿名哈希

  • 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中二维数据结构的详细信息,请参阅。

    Perl喜欢扁平化数据结构。这通常是一件好事……例如,
    (@options,“另一个选项”,“还有另一个”)
    作为一个列表结束

    如果你真的想让一个结构在另一个结构中,那么内部结构需要是一个引用。像这样:

    %a{1} = { %b };  
    
    大括号表示一个散列,您正在用来自%b的值填充该散列,并作为引用而不是直接散列返回

    你也可以说

    $a{1} = \%b;   
    

    但是这也改变了%b的变化$a{1}。

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

    这也是一个提示。如果您刚刚学习散列,perl有一个名为Data::Dumper的模块,它可以为您非常方便地打印数据结构,当您想检查数据结构的值时,它非常方便

    use Data::Dumper;
    print Dumper(\%a); 
    
    当你打印这个时,它会显示

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

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


    我建议您阅读perlreftut,而不是重新散列(heh)如何创建多级数据结构。perlref更完整,但一开始有点难以理解。

    为什么这不起作用的原因是,基本上,散列或数组只能包含标量值,而散列不是标量。但是,哈希引用是:)下面的答案有一些关于原因的好链接。谢谢!我忘了perldsc。我必须看着perlref才能记住perlreftut的存在。:-)“我认为我应该重新熟悉这些文档。@davidwall复习文档总是很好的,但特别是教程部分很容易忘记,但不能错过。我特别记得我喜欢
    perlre
    perlreftut
    perldsc
    perlopentut
    perltoot
    (可能这一个已经过时或与当前关于Perl中OO的最佳实践脱节-不确定)和
    perlstyle
    @Mike:使用严格应该是标准的,这不是特例。@ether我意识到,现在我在学习Perl,刚刚发现strict
    perldoc perllol
    一直都是数组,我想
    perldoc-perldsc
    进入更复杂的场景(包括散列)。我还强烈建议对Perl中的引用新手使用
    perldoc perlreftut