Как узнать, является ли Perl-хеш многомерным? - PullRequest
5 голосов
/ 26 августа 2010

Предположим, у меня есть такой хеш-код:

$hash_ref = {

  'hashes' => {
    'h1' => { 'klf' => '1', 'moomooland' => '1' },
    'h2' => { 'klf' => '2', 'moomooland' => '2' },
    'h3' => { 'klf' => '3', 'moomooland' => '3' }
  },

  'keys' => {
    'k1' => 'key1',
    'k2' => 'key2',
    'k3' => 'key3'
  }

}

Как я могу как можно проще узнать, что hashes содержит еще 3 хеша, а keys содержит 3 пары ключ / значение?

ref вернет HASH для них обоих, и я не уверен, возможно ли определить глубину этих хешей.

Спасибо:)

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

Вы также можете first и grep для этого:

use List::Util 'first';
say 'is multi-dimensional' if first { ref } values %$hash_ref;

# explicitly check for HASH ref this time
my $how_many_md_hashes = grep { 'HASH' eq ref } values %$hash_ref;

NB. first (часть List::Util базового модуля) коротких замыканий, поэтому идеально подходит для условных вычислений и, вероятно, является самым быстрым из всех возможных вариантов.

/ I3az /

5 голосов
/ 26 августа 2010

Если вам просто нужно знать, является ли хеш многомерным, вы можете перебрать его значения и остановиться, если ссылка найдена:

my $is_multi_dimensional = 0;

for my $value (values %$hash_ref) {
    if ('HASH' eq ref $value) {
        $is_multi_dimensional = 1;
        last;
    }
}

или вы можете использовать функцию each():

while (my (undef, $value) = each %$hash_ref) {
    if ('HASH' eq ref $value) {
        $is_multi_dimensional = 1;
        last;
    }
}
1 голос
/ 26 августа 2010

Вы можете попробовать это, чтобы узнать глубину хеша Perl:

#!/usr/bin/perl
use strict;
my $hash_ref = {

  'hashes' => {
    'h1' => { 'klf' => '1', 'moomooland' => '1' },
    'h2' => { 'klf' => '2', 'moomooland' => '2' },
    'h3' => { 'klf' => '3', 'moomooland' => '3' }
  },

  'keys' => {
    'k1' => 'key1',
    'k2' => 'key2',
    'k3' => 'key3'
  }

};
print_nested_hash($hash_ref, 0);

sub print_nested_hash {
    my $hash_ref = shift;
    my $depth = shift;
    foreach my $key (sort keys %{$hash_ref}) {
        print '    ' x $depth, $key, "\n";

        if (ref($hash_ref->{$key}) eq "HASH") {
            print_nested_hash($hash_ref->{$key}, $depth+1);
        }
    }
} 

ВЫВОД:

hashes
    h1
        klf
        moomooland
    h2
        klf
        moomooland
    h3
        klf
        moomooland
keys
    k1
    k2
    k3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...