URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9914
[ Назад ]

Исходное сообщение
"Анонимный хеш с массивами, не могу вывести массив по ключу"

Отправлено chinarulezzz , 06-Окт-14 08:59 
Есть такая структура анонимного хеша:

$VAR = {
    'VAL1' => [
              'text1',
              'text2'
              ],
    'VAL2' => [
               num1,
               num2
              ]
};

не могу получить доступ к массиву вот так:
 print @{ $hash_ref->{'VAL1'} }; 

а так норм:

@array = keys $hash_ref;
$index = 1;
print @{ $hash_ref->{ $array[$index] } };

и даже так:

print @{ $hash_ref->{ each $hash_ref } };

а вот по ключу никак :( Почему?

Содержание

Сообщения в этом обсуждении
"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено XAnder , 06-Окт-14 10:04 
Странно, у меня не воспроизводится. perl 5.14.2

>

 print @{ $hash_ref->{'VAL1'} }; 

Пример работает нормально. Дайте больше кода.

> а так норм:
>

 
> @array = keys $hash_ref;
> $index = 1;
> print @{ $hash_ref->{ $array[$index] } };
>

> и даже так:
>
 
> print @{ $hash_ref->{ each $hash_ref } };
>

Как раз и не норм. keys и each возвращают ключи в случайном порядке, и какой из них будет VAL1, можно только гадать.

Кстати, а что говорит print keys %$hash_ref?

PS. keys/each $hash_ref я не стал бы использовать, потому что это экспериментальная возможность и не работает до версии 5.14


"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено chinarulezzz , 06-Окт-14 10:22 
вот:

#!/usr/bin/perl

my $href;
{
    open my $in, '<', 'dump';
    local $/;
    $href = eval <$in>;
    close $in;
}
my $numrecs = $#{ $href->{each $href} };
my @names = keys $href;

print join '', @{ $href->{'NAME'} };
print @{ $href->{each $href} };
print @{ $href->{$names[1]} };


файл-dump: http://pastebin.com/tLW0W3xr

>Как раз и не норм. keys и each возвращают ключи в случайном порядке, и какой из них будет VAL1, можно только гадать.

это для примера что только так могу вытаскивать значения из хэша. Но конечно, это не то что мне надо.

>Кстати, а что говорит print keys %$hash_ref?

0

P.S. Версия 5.18.1


"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено XAnder , 06-Окт-14 10:56 
Слегка изменил:


#!/usr/bin/perl

my $href;
{
    open my $in, '<', 'dump';
    local $/;
    $href = eval <$in>;
    close $in;
}

print join ' ', @{ $href->{'NAME'} };
print "\n";

print join ' ', keys %$href;
print "\n";

Вывод:


Vadim Andrew Lesea Olea Masha Olesya Nikita Vanya Denis Emmanuel Nikifor Vasile Dumitru
ID NAME AGE

В общем, у меня всё работает. Может в 5.18 что-то изменилось, но сомневаюсь.


"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено chinarulezzz , 06-Окт-14 11:07 
5.18. Не работает в нескольких дистрах. Что 5.18.1, что 5.18.2

"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено XAnder , 06-Окт-14 12:39 
> 5.18. Не работает в нескольких дистрах. Что 5.18.1, что 5.18.2

Увы, 5.18 у меня нет, а ставить лень. Есть тестовая виртуалка с Debian Jessie, там 5.20.1. Проверил — результат идентичен вышепредставленному с 5.14, то есть всё работает, как надо. И я ума не приложу, что там может НЕ работать, всё же просто.


"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено Pahanivo , 06-Окт-14 10:05 
>[оверквотинг удален]
>            
>    num1,
>            
>    num2
>            
>   ]
> };
>

> не могу получить доступ к массиву вот так:
>
 print @{ $hash_ref->{'VAL1'} }; 

я попробовал и у меня получилось
видимо от того что у вас исходно ссылка на хеш лежала в $VAR, а использовалась из $hash_ref.


"Анонимный хеш с массивами, не могу вывести массив по ключу"
Отправлено chinarulezzz , 06-Окт-14 10:25 
>[оверквотинг удален]
>>    num2
>>
>>   ]
>> };
>>
>> не могу получить доступ к массиву вот так:
>>
 print @{ $hash_ref->{'VAL1'} }; 

> я попробовал и у меня получилось
> видимо от того что у вас исходно ссылка на хеш лежала в
> $VAR, а использовалась из $hash_ref.

обновил инфу в предыдущем комменте.