Как напечатать хеш-структуру в Perl? - PullRequest
4 голосов
/ 12 марта 2010

Примеры:

%hash = (2010 => 21, 2009=> 9);

$hash = {
    a => {
        0 => {test => 1},
        1 => {test => 2},
        2 => {test => 3},
        3 => {test => 4},
    },
};

Как мне распечатать хеш?

Ответы [ 9 ]

16 голосов
/ 12 марта 2010

Хотите ли вы напечатать весь хэш или конкретный ключ, пары значений? И каков твой желаемый результат? Если это только для целей отладки, вы можете сделать что-то вроде:

use Data::Dumper;
print Dumper %hash; # or \%hash to encapsulate it as a single hashref entity;

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

while ( my($key, $value) = each %hash ) {
    print "$key = $value\n";
}

Или конструкция for / foreach, если вы хотите ее отсортировать:

for my $key ( sort keys %hash ) {
    print "$key = $hash{$key}\n";
}

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

print "@hash{qw{2009 2010}}\n";

и т. Д., И т. Д. Всегда есть несколько способов сделать это, хотя это помогает узнать, что вы делаете сначала:)

2 голосов
/ 12 марта 2010

Синтаксис для доступа к внутренним ячейкам для вашего второго примера:

print $hash->{"a"}{0}{"test"}

Это даст вам 1 в вашем примере.

Если вы хотите выполнить итерацию, вы можете сделать это следующим образом (строки для печати приведены для иллюстрации):

my $hash = {"a"=>{ 0=>{"test"=>1}, 1=>{"test"=>2}, 2=>{"test"=>3}, 3=>{"test"=>4} } };
print "Direct access to item : ".$hash->{"a"}{1}{"test"}."\n";

foreach my $k1 (keys(%$hash)) {
    print "keys of level 1: $k1\n";
    foreach my $k2 (keys(%{$hash->{$k1}})) {
        print "keys of level 2: $k2\n";
        print "values: ".$hash->{$k1}{$k2}{"test"}."\n"
     }
}

Обратите внимание, что все немного сложнее, чем необходимо, потому что внешний $ hash является скалярной ссылкой на анонимный хеш. Было бы проще, если бы это был хеш (то есть, как в my %hash = (1, 2); print $hash{1};).

( TIMTOWTDI : очевидно, есть несколько способов сделать это; я считаю, что приведенный выше пример является для меня самым простым, но не самым эффективным; использование each вместо keys для повторение позволит избежать одного ненужного поиска хеша).

2 голосов
/ 12 марта 2010

вместо

%hash = { 2010=> 21, 2009=> 9 }

вы должны написать

%hash = ( 2010=> 21, 2009=> 9 ); 

с помощью фигурных скобок вы получаете ССЫЛКУ на анонимный хеш, который затем сохраняется как первый ключ вашего% хэша.

2 голосов
/ 12 марта 2010
  while( my( $key, $value ) = each( %hash ) ) {
         ...
  }
1 голос
/ 16 декабря 2014

вы можете попробовать с этим,

while(my ($key,$val)=each %HASH){
print $key," = ",$val,"\n";
while(my ($kkey,$vval)=each %{$HASH{$key}}){
print "   ",$kkey," = ",$vval,"\n";
}
}
0 голосов
/ 23 июля 2015

Функция printStruct ниже работает с использованием рекурсии и может печатать хэши массивов, массивы хэшей или любую их смесь на любую глубину. Вы называете это ссылкой на вашу структуру и именем структуры в строке. Последний ввод $ pre используется только во время рекурсии, чтобы сообщить начальную запись в рекурсивную функцию. Просто оставьте это поле пустым при вызове функции.

%hash = (2010 => 21, 2009=> 9);
printStruct(\%hash,"\%hash");

$hash = {
    a => {
        0 => {test => 1},
        1 => {test => 2},
        2 => {test => 3},
        3 => {test => 4},
    },
};
$hash->{b}=[1..5];
printStruct($hash,"\$hash");
my @array=[apple,banana,orange,$hash];
printStruct(\@array,"\@array");

sub printStruct {
    my ($struct,$structName,$pre)=@_;
    print "-----------------\n" unless (defined($pre));
    if (!ref($struct)){ # $struct is a scalar.
    print "$structName=$struct\n";
    } elsif (ref($struct) eq "ARRAY") { # Struct is an array reference
    return ("ARRAY(".scalar(@$struct).")") if (@$struct>100);
    for(my$i=0;$i<@$struct;$i++) {
        if (ref($struct->[$i]) eq "HASH") {
        printStruct($struct->[$i],$structName."->[$i]",$pre." ");
        } elsif (ref($struct->[$i]) eq "ARRAY") { # contents of struct is array ref
        print "$structName->"."[$i]=()\n" if (@{$struct->[$i]}==0);
        my $string = printStruct($struct->[$i],$structName."->[$i]",$pre." ");
        print "$structName->"."[$i]=$string\n" if ($string);
        } else { # contents of struct is a scalar, just print it.
        print "$structName->"."[$i]=$struct->[$i]\n";
        }
    }
    return();
    } else { # $struct is a hash reference or a scalar
    foreach (sort keys %{$struct}) {
        if (ref($struct->{$_}) eq "HASH") {
        printStruct($struct->{$_},$structName."->{$_}",$pre." ");
        } elsif (ref($struct->{$_}) eq "ARRAY") { # contents of struct is array ref
        my $string = printStruct($struct->{$_},$structName."->{$_}",$pre." ");
        print "$structName->"."{$_}=$string\n" if ($string);
        } else { # contents of struct is a scalar, just print it.
        print "$structName->"."{$_}=$struct->{$_}\n";
        }
    }
    return();
    } 
    print "------------------\n" unless (defined($pre));
    return();
}

Результат:

-----------------
%hash->{2009}=9
%hash->{2010}=21
-----------------
$hash->{a}->{0}->{test}=1
$hash->{a}->{1}->{test}=2
$hash->{a}->{2}->{test}=3
$hash->{a}->{3}->{test}=4
$hash->{b}->[0]=1
$hash->{b}->[1]=2
$hash->{b}->[2]=3
$hash->{b}->[3]=4
$hash->{b}->[4]=5
-----------------
@array->[0]->[0]=apple
@array->[0]->[1]=banana
@array->[0]->[2]=orange
@array->[0]->[3]->{a}->{0}->{test}=1
@array->[0]->[3]->{a}->{1}->{test}=2
@array->[0]->[3]->{a}->{2}->{test}=3
@array->[0]->[3]->{a}->{3}->{test}=4
@array->[0]->[3]->{b}->[0]=1
@array->[0]->[3]->{b}->[1]=2
@array->[0]->[3]->{b}->[2]=3
@array->[0]->[3]->{b}->[3]=4
@array->[0]->[3]->{b}->[4]=5

Эта функция помогла в программировании и отладке сложных структур. Я надеюсь, что вы, ребята, сочтете это полезным.

0 голосов
/ 12 марта 2010
printf ("%s = %s\n", $_, $hash {$_}) foreach (keys (%hash));
0 голосов
/ 12 марта 2010

Это должно помочь:

foreach $key (keys %hash)
{
  print "key is : $key, value is : $hash{$key}\n";
}

ура

0 голосов
/ 12 марта 2010

использование keys , values функция

@keys = keys %hash ; 

@values = values %hash 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...