perl hash {} {}意味着什么

时间:2015-02-14 15:37:06

标签: perl hash

我的教授在幻灯片上有一些我不理解的语法。

在perl中有:

$hash{$string}{$anotherString}++;

这种语法是什么意思?如果是:

$hash{$string}{$int}++;

它会增加价值吗? 当我使用

打印时
while( my( $key, $value ) = each %hash ){print "$key: $value\n";}

我的输出是     “key”:HASH(0xbe0200)

3 个答案:

答案 0 :(得分:4)

这是一个二维哈希,哈希哈希。一旦您意识到任何单个值实际上是标量,就很容易跟踪Perl中的结构。在多维结构的情况下,标量值是参考。例如:

my %outer = ( "foo" => { "bar" => 1 } );

内部部分{ "bar" => 1 }是哈希引用。在赋值中使用{ }表示匿名哈希。这类似于:

my %inner = ( "bar" => 1 );
my %outer = ( "foo" => \%inner );

现在,当您想引用%inner中的值时,您可以使用第一个键来访问哈希引用,使用第二个键来访问%inner中的值:

print $outer{"foo"}{"bar"};  # prints 1

当您对某个值使用increment operator ++时,它会递增:

$outer{"foo"}{"bar"}++;      # the value is now 2

答案 1 :(得分:2)

$hash{string1}{string2}

的较短等价物
$hash{string1}->{string2}

即。它从哈希散列中返回一个值。

通过应用++运算符,内部哈希中的值会递增。

答案 2 :(得分:1)

  

我的输出是“key”:HASH(0xbe0200)

这个奇怪的输出意味着你要打印的内容实际上是一个哈希引用

use strict; 
use warnings; 
use 5.016;  #allows you to use say(), which is equivalent to print() 
            #plus a newline at the end

my $href = {
    a => 1,
    b => 2,
};

say $href;

--output:--
HASH(0x100826698)

或者,

my %hash = (
    a => 1,
    b => 2,
);

say \%hash;

--output:--
HASH(0x1008270a0)

\运算符获取右侧的东西的引用

打印实际哈希的最简单方法是使用Data :: Dumper,这是你可以并且将一直使用的东西:

use strict; 
use warnings; 
use 5.016;
use Data::Dumper;

my $href = {
    a => 1,
    b => 2,
};


say Dumper($href);

$VAR1 = {
          'a' => 1,
          'b' => 2
        };

use warnings;一样,我认为每个节目都必须使用use Data::Dumper;

因此,当您看到奇怪的输出时,如HASH(0xbe0200),请在值上使用Data :: Dumper:

my %hash = (
    a => 1,
    b => { hello => 2, goodbye => 3},
);

while( my( $key, $value ) = each %hash ){
    say $key;
    say Dumper($value);
    say '-' x 10;
}

--output:--
a
$VAR1 = 1;

----------
b
$VAR1 = {
          'hello' => 2,
          'goodbye' => 3
        };

----------

或者,只需在整个结构上使用Data :: Dumper:

my %hash = (
    a => 1,
    b => { hello => 2, goodbye => 3},
);


say Dumper(\%hash);

--output:--
$VAR1 = {
          'a' => 1,
          'b' => {
                   'hello' => 2,
                   'goodbye' => 3
                 }
        };

请注意,Dumper()用于显示哈希引用(或任何其他引用)的内容,因此如果您的变量不是引用,例如%hash,然后您必须使用\运算符将其转换为引用,例如\%hash

现在,如果你有这个哈希:

my %hash = (
    a => 1,
    b => { hello => 2, goodbye => 3},
);

...要检索“再见”对应的值,可以写:

say $hash{b}{goodbye};  #=>3

$hash{b}返回哈希(引用){ hello => 2, goodbye => 3},您可以使用下标{hello}{goodbye}从该哈希值中检索值。

或者,你可以这样写:

my %hash = (
    a => 1,
    b => { hello => 2, goodbye => 3},
);

my $string = 'b';
my $anotherString = 'goodbye';

say $hash{$string}{$anotherString};  #=>3

要增加散列中的值3,您可以写:

my $result = $hash{$string}{$anotherString}++;
say $result;  #=>3
say $hash{$string}{$anotherString};  #=>4

postfix ++运算符实际上在当前操作之后递增值,因此$ result为3,然后散列中的值增加到4,如下所示:

my $temp = $hash{$string}{$anotherString};
$hash{$string}{$anotherString} = $hash{$string}{$anotherString} + 1;
my $result = $temp;

如果您想在当前操作之前发生增量,那么您可以使用prefix ++运算符:

my $result = ++$hash{$string}{$anotherString};
say $result;  #=>4
say $hash{$string}{$anotherString}; #=>4

最后,如果$hash{$string}{$anotherString}的值不是数字,例如'绿色',你会得到一些奇怪的东西:

my %hash = (
    a => 1,
    b => { hello => 2, goodbye => 'green'},
);

my $string = 'b';
my $anotherString = 'goodbye';

my $result = $hash{$string}{$anotherString}++;
say $hash{$string}{$anotherString};

--output:--
greeo

perl有一个概念,即字符串'green'之后的字符串是字符串'greeo',因为字母“o”位于字母表中的字母“n”之后。如果你增加的字符串是'greez',那么输出将是:

  greez  original
  grefa  output

'z'之后的下一个字母是以'a'重新开始,但就像你将9增加1并得到10一样,'z'的增量会转移到左边的列,递增那个字母1,产生'f'。哈!