Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > values & keys


Автор: Loki 10.6.2009, 14:24
всем привет, 
подскажите как сделать в перле следующее.
у меня есть такой массив где для одиноковый 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 не юзая прочии функции.

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

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

Код

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

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

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

Автор: Loki 10.6.2009, 18:45
Цитата

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

а если нет? то так и никак иначе не выйдет? потому что в хэш у меня значения постепенно накапливаются, а потом типо нужно выбирать по каждому хэшу все значения, еще есть reverse, но тогда то же самое росто местами поменяется. т.е. если у меня так как в %a, хэши разные, а значения должны быть у никальными и по каждому хэшу вывести все значения не выйдет кроме как менять структуру записи?

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

Автор: Loki 11.6.2009, 00:41
потому-что иначе мне придется делать двусвязный @ массив
или как добавить данные в %a что-бы там было 'a' => [ '1', '2' ], ?
например у меня уже там есть 'a' =>  '1', как добавить в  'a' еще двойку и не потерять единицу?

Автор: kavkaz 11.6.2009, 06:38
хранить изначально
Код

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


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

Автор: amg 11.6.2009, 07:02
Цитата(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"; # и напечатать



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)