代码之家  ›  专栏  ›  技术社区  ›  Mike

如何在Perl中创建哈希散列?

  •  7
  • Mike  · 技术社区  · 14 年前

    基于我目前对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}"; 
    

    我假设散列就像一个数组,那么为什么我不能使一个散列包含另一个?

    5 回复  |  直到 14 年前
        1
  •  6
  •   daotoad    14 年前
    1. 在程序中应始终使用“use strict;”。

    2. 使用引用和匿名散列。

    <> <代码> >

    use strict;use warnings;
    我的%A;
    
    我的%B;
    $B str=你好;
    $ { 1 }={%B};
    
    %b=();
    $B str=世界;
    $ { 2 }={%B};
    
    打印“$A 1 str$A 2 str”
    < /代码> 
    
    

    %bcreates reference to copy of hash%b。您需要在此处复制,因为您稍后清空它。

    在程序中应该始终使用“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. 你需要复制到这里,因为你稍后清空它。

        2
  •  6
  •   mob    14 年前

    散列的散列很难第一次正确。在这种情况下

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

    会把你带到你想去的地方。

    perldoc perllol 有关Perl中二维数据结构的详细信息。

        3
  •  4
  •   David Wall    14 年前

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

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

        4
  •  2
  •   dalton    14 年前

    迈克,亚历山大的回答是对的。

    也是小费。如果您只是在学习hashes,Perl有一个名为data::dumper的模块,它可以为您漂亮地打印数据结构,当您想检查数据结构的值时,这非常方便。

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

    当你打印这个时,它会显示

    $VAR1 = {
              '1' => {
                       'str' => 'hello'
                     },
              '2' => {
                       'str' => 'world'
                     }
            };
    
        5
  •  1
  •   cHao Hammerite    14 年前

    Perl喜欢扁平化数据结构。这通常是件好事……例如, (@options, "another option", "yet another") 最后是一张单子。

    如果您真的打算在另一个结构中有一个结构,则内部结构需要作为参考。像这样:

    %a{1} = { %b };  
    

    大括号表示一个散列,您用来自%b的值填充它,然后作为引用而不是直接散列返回。

    你也可以说

    $a{1} = \%b;   
    

    但这也使得对%B的更改变为$A 1。