Печать многоключевого хэша на Perl - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть хеш perl, который я индексирую так:

my %hash;
$hash{'number'}{'even'} = [24, 44, 38, 36];
$hash{'number'}{'odd'} = [23, 43, 37, 35];

Когда я пытаюсь напечатать имена клавиш, как это:

foreach my $key (keys %hash{'number'})
{
   print "Key: $key\n";
}

Я получаю следующую ошибку:

Type of arg 1 to keys must be hash (not hash slice) at test.pl

Однако, когда я передаю массив ref функции и печатаю его там, он печатает значения:

test(\%hash);

sub test
{
   my ($hash) = @_;
   foreach my $key (keys %{$hash->{'number'}})
   {
       print "Key: $key\n";     #outputs: even odd
   }
}

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

foreach my $key (keys %hash)
{
print "First Key: $key\n";  #Outputs number
}

Тогда я всегда получу «число» в качестве правильного выхода, и я никогда не смогу получить «четное», «нечетное» в качестве выходных данных, верно? Это просто для ознакомления с хорошей практикой кодирования:)

Это полный код:

sub test
{
    my ($hash) = @_;
    foreach my $key (keys %{$hash->{'number'}})
    {
        print "Key: $key\n";
    }

}

my %hash;
$hash{'number'}{'even'} = [24, 44, 38, 36];
$hash{'number'}{'odd'} = [23, 43, 37, 35];

test(\%hash);

foreach my $key (keys %hash)
{
    print "First Key: $key\n";
}

foreach my $key (keys %hash{'number'})
{
  print "Key: $key\n";
}

Спасибо, Новичок

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012
my %hash;
$hash{'number'}{'even'} = [24, 44, 38, 36];
$hash{'number'}{'odd'} = [23, 43, 37, 35];

%hash - это хеш, ключи которого являются строками ('number'), а значения - ссылками на хеш.

foreach my $key (keys %hash{'number'})
{
   print "Key: $key\n";
}

Чтобы сослаться на значение, которое является частью %hash, вы хотите написать $hash{'number'}, а не %hash{'number'}.

Но $hash{'number'} - это ссылка на хеш, а не хеш. Чтобы сослаться на хеш, к которому он относится, вы можете написать это:

%{$hash{'number'}}

Соберите все это вместе:

my %hash;
$hash{'number'}{'even'} = [24, 44, 38, 36];
$hash{'number'}{'odd'} = [23, 43, 37, 35];

foreach my $key (keys %{$hash{'number'}}) {
   print "Key: $key\n";
}

выдаст такой вывод:

Key: even
Key: odd

(возможно, не в этом порядке).

0 голосов
/ 18 февраля 2012

Вы можете сделать что-то вроде этого:

#!/usr/bin/perl -w
use strict;
use warnings;

my %hash;
$hash{'number'}{'even'} = [24, 44, 38, 36];
$hash{'number'}{'odd'} = [23, 43, 37, 35];

foreach my $i(keys %hash){
    print $i;
    foreach my $j(keys %{$hash{$i}}){
        print "\t".$j."\t";
        print join(" ",@{$hash{'number'}{$j}})."\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...