Is there an easy way to verify the hash of a hash element that exists and is defined?

I need to check the Perl hash hash, for example $Table{$key1}{$key2}, for existence and definition. That's what I'm doing. (I have no idea $key1even exists)

if 
((defined $Table{$key1}) &&
 (exists  $Table{$key1}) &&
 (defined $Table{$key1}{$key2}) &&
 (exists  $Table{$key1}{$key2})) 
{
   #do whatever
}

Is there an easier and clearer way to do this?

+5
source share
5 answers

: . exists , ( undefined), , , , defined, . , false, :

if ($Table{$key1}{$key2})
{
   # do whatever
}

, , "" ( ), , ,

if (defined $Table{$key1}{$key2})
{
   # do whatever
}

autovivify $Table{$key1}, , , "" :

if (exists $Table{$key1} and defined $Table{$key1}{$key2})
{
   # do whatever
}

, OO, :

sub has_field
{
    my ($this, $fieldName) = @_;
    return exists $this->{data} && defined $this->{data}{$fieldName});
}

, , :

, , exists true, - , undefined. , .
...
hash array , , , .

+8

:

 if (exists $table{$key1} and defined $table{$key1}{$key2}) {...}

.

+5

, . ( , .) , exists. defined. , :

if (exists $hash{a} && defined $hash{a}{b}) {...}

, :

if (exists $hash{a} && exists $hash{a}{b} && exists $hash{a}{b}{c} ...) {...}

defined, :

sub safe_defined {
    my $h = shift;

    foreach my $k (@_) {
        if (ref $h eq ref {}) {
            return unless exists $h->{$k};
            $h = $h->{$k};
        }
        else {
            return;
        }
    }

    return defined $h;
}

:

if (safe_defined(\%hash, qw(a b c))) {
     say $hash{a}{b}{c};
}

. .

  • . Perl , ...
  • (.. ).

.;)

+1

Data::Diver. . :

if ( defined Dive(\%Table, $key1, $key2) ) { ... }

:

if ( defined(my $value = Dive(\%Table, $key1, $key2) ) ) {
  ...do something with $value...
}
+1

! .

, "" , .. if ( $Table {$ key1} && & defined $ {$ key1} {$ key2}) {

}

, , , , , 3-4 , .

: . .

, ,

0

All Articles