Как я печатаю структуру хеша в Perl?

Примеры:

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

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

Как я печатаю хеш?

5
задан FMc 12 March 2010 в 13:02
поделиться

7 ответов

использовать ключи, значения функция

@keys = keys %hash ; 

@values = values %hash 
0
ответ дан 18 December 2019 в 06:49
поделиться

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

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

ура

{{ 1}}
0
ответ дан 18 December 2019 в 06:49
поделиться
  while( my( $key, $value ) = each( %hash ) ) {
         ...
  }
2
ответ дан 18 December 2019 в 06:49
поделиться

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

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 : очевидно, есть несколько способов сделать это; я считаю, что приведенный выше пример является для меня самым простым, но не самым эффективным; использование каждого вместо ключи для итерации позволили бы избежать одного ненужного поиска по хэшу).

2
ответ дан 18 December 2019 в 06:49
поделиться
printf ("%s = %s\n", $_, $hash {$_}) foreach (keys (%hash));
0
ответ дан 18 December 2019 в 06:49
поделиться

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

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";
}

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

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

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

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

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

16
ответ дан 18 December 2019 в 06:49
поделиться

вместо

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

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

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

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

2
ответ дан 18 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: