有一个 perl 散列是什么意思{}{}
What does it mean to have a perl hash{}{}
我的教授在幻灯片上有一些我不理解的语法。
在 perl 中有:
$hash{$string}{$anotherString}++;
这个语法是什么意思?如果是:
$hash{$string}{$int}++;
会增加价值吗?
当我使用
打印时
while( my( $key, $value ) = each %hash ){print "$key: $value\n";}
我的输出是
"key":哈希(0xbe0200)
$hash{string1}{string2}
是
的缩写
$hash{string1}->{string2}
即它 returns 来自哈希的哈希值。
通过应用 ++
运算符,内部散列中的值会增加。
那是二维哈希,哈希的哈希。一旦您意识到任何单个值实际上都是标量,就很容易在 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
My output is "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)
\
运算符获取右侧事物的 reference。
打印实际散列的最简单方法是使用 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},
);
...获取'goodbye'对应的值,可以这样写:
say $hash{b}{goodbye}; #=>3
$hash{b}
returns 哈希(参考){ 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,然后hash中的值增加到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}
处的值不是数字,例如'green',你会得到一些奇怪的东西:
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'。哈!
我的教授在幻灯片上有一些我不理解的语法。
在 perl 中有:
$hash{$string}{$anotherString}++;
这个语法是什么意思?如果是:
$hash{$string}{$int}++;
会增加价值吗? 当我使用
打印时while( my( $key, $value ) = each %hash ){print "$key: $value\n";}
我的输出是 "key":哈希(0xbe0200)
$hash{string1}{string2}
是
的缩写$hash{string1}->{string2}
即它 returns 来自哈希的哈希值。
通过应用 ++
运算符,内部散列中的值会增加。
那是二维哈希,哈希的哈希。一旦您意识到任何单个值实际上都是标量,就很容易在 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
My output is "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)
\
运算符获取右侧事物的 reference。
打印实际散列的最简单方法是使用 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},
);
...获取'goodbye'对应的值,可以这样写:
say $hash{b}{goodbye}; #=>3
$hash{b}
returns 哈希(参考){ 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,然后hash中的值增加到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}
处的值不是数字,例如'green',你会得到一些奇怪的东西:
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'。哈!