拥有perl哈希{}{}意味着什么

拥有perl哈希{}{}意味着什么,perl,hash,Perl,Hash,我的教授在幻灯片上有一些我不懂的语法 在perl中有: $hash{$string}{$anotherString}++; 这个语法是什么意思?如果是: $hash{$string}{$int}++; 它会增加值吗? 当我使用 while( my( $key, $value ) = each %hash ){print "$key: $value\n";} 我的输出是 “键”:散列(0xbe0200) 是一个较短的等价物 $hash{string1}->{string2} i、 它

我的教授在幻灯片上有一些我不懂的语法

在perl中有:

$hash{$string}{$anotherString}++;
这个语法是什么意思?如果是:

$hash{$string}{$int}++;
它会增加值吗? 当我使用

while( my( $key, $value ) = each %hash ){print "$key: $value\n";}
我的输出是 “键”:散列(0xbe0200)

是一个较短的等价物

$hash{string1}->{string2}
i、 它从散列中返回一个值


通过应用
++
运算符,内部散列中的值将递增。

这是一个二维散列,一个散列的散列。一旦您意识到任何单个值实际上都是标量,就很容易在Perl中跟踪结构。对于多维结构,标量值是一个引用。例如:

my %outer = ( "foo" => { "bar" => 1 } );
内部部分
{“bar”=>1}
是一个哈希引用。在赋值中使用
{}
表示匿名哈希。这类似于:

my %inner = ( "bar" => 1 );
my %outer = ( "foo" => \%inner );
现在,如果要引用
%inner
中的值,请使用第一个键访问哈希引用,第二个键访问
%inner
中的值:

print $outer{"foo"}{"bar"};  # prints 1
当对值使用时,它将递增:

$outer{"foo"}{"bar"}++;      # the value is now 2
我的输出是“key”:散列(0xbe0200)

这种奇怪的输出意味着您试图打印的内容实际上是一个散列引用:

或者

\
操作符获取右侧对象的引用

打印实际哈希的最简单方法是使用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
        };
使用警告,我考虑<代码>使用数据::Dumper;<代码>每个程序都是必需的

因此,当您看到奇怪的输出时,如
散列(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
my $result = $hash{$string}{$anotherString}++;
say $result;  #=>3
say $hash{$string}{$anotherString};  #=>4
$hash{b}
返回散列(参考)
{hello=>2,再见=>3}
,您可以使用下标
{hello}
{bye}
从该散列中检索值

或者,您可以这样写:

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

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

say $hash{$string}{$anotherString};  #=>3
要增加散列中的值3,可以编写:

say $hash{b}{goodbye};  #=>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”。哈!

如果
$hash{$string}{$anotherString}
是一个整数,则
$hash{$string}{$anotherString}++
将其递增。问题是什么?你的产量是合理的
$hash{$string}
是一个哈希。它在索引
$anotherString
处的值是一个整数,这行代码正在递增它。因此这只是编写键值对的另一种方法?如果编写
$hash\u of_hash{$string}{$anotherString}
,代码可能会更清晰。这在文档中解释得相当清楚:
perldocperllol
谢谢,这让我现在走上了正确的道路。
  greez  original
  grefa  output