Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> values & keys 
:(
    Опции темы
Loki
  Дата 10.6.2009, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



всем привет, 
подскажите как сделать в перле следующее.
у меня есть такой массив где для одиноковый keys есть разные values, но нужно вывести не 1 value а все.
Код

my %a(
'a' => '1',
'a' => '2',
'b' => '3',
'c' => '4',
);
print $a{'a'};

мне нужно вывести
1
2
а выводится только 2, ну а если я в цикле делаю
Код

foreach(keys %a){
....
}

то выводит только 
2
3
4
пробовал делать
Код

my @x = $a{'a'};

в @x все равно 1 значени, в идеале мне нужно получить список в @ что-бы потом удобно перебрать его в foreach не юзая прочии функции.
PM MAIL   Вверх
ginnie
Дата 10.6.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Цитата(Loki @  10.6.2009,  14:24 Найти цитируемый пост)
у меня есть такой массив

У Вас не массив, а хэш. Чтобы из хэша получить список значений для ключа надо в хэше по этому ключу хранить массив.

Код

my %a(
'a' => [ '1', '2' ],
'b' => '3',
'c' => '4',
);

push(@{$a{a}}, '3'); # добавляем значение в список

print join(', ', @{$a{a});


Это сообщение отредактировал(а) ginnie - 10.6.2009, 14:31


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Loki
Дата 10.6.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



Цитата

Чтобы из хэша получить список значений для ключа надо в хэше по этому ключу хранить массив.

а если нет? то так и никак иначе не выйдет? потому что в хэш у меня значения постепенно накапливаются, а потом типо нужно выбирать по каждому хэшу все значения, еще есть reverse, но тогда то же самое росто местами поменяется. т.е. если у меня так как в %a, хэши разные, а значения должны быть у никальными и по каждому хэшу вывести все значения не выйдет кроме как менять структуру записи?
PM MAIL   Вверх
ginnie
Дата 10.6.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Loki, не могли бы Вы указать, почему Вы не можете сохранять значения внутри хеша в виде массива?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Loki
Дата 11.6.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



потому-что иначе мне придется делать двусвязный @ массив
или как добавить данные в %a что-бы там было 'a' => [ '1', '2' ], ?
например у меня уже там есть 'a' =>  '1', как добавить в  'a' еще двойку и не потерять единицу?
PM MAIL   Вверх
kavkaz
Дата 11.6.2009, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 26.12.2007

Репутация: 1
Всего: 2



хранить изначально
Код

{
   a => [ 1 ],
   b => [ 2, 3 ],
   c => [ 4 ]
}


вы же сами сказали что хэш дополняется... вот вам и превращение без потерь
PM MAIL ICQ Skype   Вверх
amg
Дата 11.6.2009, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(Loki @  11.6.2009,  00:41 Найти цитируемый пост)
у меня уже там есть 'a' =>  '1', как добавить в  'a' еще двойку и не потерять единицу?
Лучше всего, конечно, как все и говорят, изначально работать с хэшем массивов. Но если по каким-либо причинам это невозможно, то хэш скаляров легко превратить в хэш массивов:
Код
%h = (a=>1, b=>2);
%h = map {$_ => [$h{$_}]} keys %h;
push @{$h{a}}, 2;   # Теперь можно добавить к а двойку
print "@{$h{a}}\n"; # и напечатать



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0451 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.