The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Анонимный хеш с массивами, не могу вывести массив по ключу"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от chinarulezzz (ok) on 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 } };

а вот по ключу никак :( Почему?
Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от XAnder (ok) on 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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от chinarulezzz (ok) on 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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

5. "Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от XAnder (ok) on 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 что-то изменилось, но сомневаюсь.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

6. "Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от chinarulezzz (ok) on 06-Окт-14, 11:07 
5.18. Не работает в нескольких дистрах. Что 5.18.1, что 5.18.2
Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

2. "Анонимный хеш с массивами, не могу вывести массив по ключу"  +/
Сообщение от Pahanivo (ok) on 06-Окт-14, 10:05 
>[оверквотинг удален]
>            
>    num1,
>            
>    num2
>            
>   ]
> };
>
> не могу получить доступ к массиву вот так:
>
 print @{ $hash_ref->{'VAL1'} }; 

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру