Есть такая структура анонимного хеша:
$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 } };
а вот по ключу никак :( Почему?
Странно, у меня не воспроизводится. 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
вот:
#!/usr/bin/perlmy $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
Слегка изменил:
#!/usr/bin/perlmy $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 что-то изменилось, но сомневаюсь.
5.18. Не работает в нескольких дистрах. Что 5.18.1, что 5.18.2
> 5.18. Не работает в нескольких дистрах. Что 5.18.1, что 5.18.2Увы, 5.18 у меня нет, а ставить лень. Есть тестовая виртуалка с Debian Jessie, там 5.20.1. Проверил — результат идентичен вышепредставленному с 5.14, то есть всё работает, как надо. И я ума не приложу, что там может НЕ работать, всё же просто.
>[оверквотинг удален]
>
> num1,
>
> num2
>
> ]
> };
>
print @{ $hash_ref->{'VAL1'} };
я попробовал и у меня получилось
видимо от того что у вас исходно ссылка на хеш лежала в $VAR, а использовалась из $hash_ref.
>[оверквотинг удален]
>> num2
>>
>> ]
>> };
>>
>> не могу получить доступ к массиву вот так:
>>print @{ $hash_ref->{'VAL1'} };
> я попробовал и у меня получилось
> видимо от того что у вас исходно ссылка на хеш лежала в
> $VAR, а использовалась из $hash_ref.обновил инфу в предыдущем комменте.