在Perl中,我有一个用类似于下面的循环创建的散列散列
my %HoH
for my $i (1..10) {
$HoH{$a}{$b} = $i;
}$a和$b是在填充HoH时确实有一些值的变量。创建HoH后,如何检查HoH中是否存在特定的对($c、$d)?以下代码不起作用
if (defined $HoH{$c}{$d}) {...}因为如果HoH中不存在$c,它将被创建为不带值的键。
发布于 2010-12-02 23:33:48
use Data::Dumper;
my %HoH;
$HoH{A}{B} = 1;
if(exists $HoH{C} && exists $HoH{C}{D}) {
print "exists\n";
}
print Dumper(\%HoH);
if(exists $HoH{C}{D}) {
print "exists\n";
}
print Dumper(\%HoH);输出:
$VAR1 = {
'A' => {
'B' => 1
}
};
$VAR1 = {
'A' => {
'B' => 1
},
'C' => {}
};自动生成是创建密钥的原因。我的第二个示例中的"exists“显示了这一点,因此第一个示例分别检查这两个键。
发布于 2010-12-03 00:51:03
写作
if (defined $HoH{$c}{$d}) {...}将会“工作”,因为它会告诉你$HoH{$c}{$d}是否有一个定义的值。问题是,如果$HoH{$c}不存在,它将被创建(使用适当的值),以便可以测试$HoH{$c}{$d}。这个过程被称为“自生动”。在设置值时很方便,例如
my %hoh;
$hoh{a}{b} = 1; # Don't need to set '$hoh{a} = {}' first但在检索可能不存在的值时不方便。我希望Perl足够聪明,只对用作左值的表达式执行自动形象化,并短路返回r值的undef,但是,天哪,它并没有那么神奇。autovivification杂注(在CPAN上可用)添加了执行此操作的功能。
为了避免自动生动,你需要先测试中间值:
if (exists $HoH{$c} && defined $HoH{$c}{$d}) {
...
}发布于 2010-12-03 01:59:10
以下几种方式:
if ( $HoH{$c} && defined $HoH{$c}{$d} ) {...}或
if ( defined ${ $HoH{$c} || {} }{$d} ) {...}或
no autovivification;
if (defined $HoH{$c}{$d}) {...}或
use Data::Diver;
if ( defined Data::Diver::Dive( \%HoH, $c, $d ) ) {...}https://stackoverflow.com/questions/4336569
复制相似问题