Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Реген из массива в хэш


Автор: Гость_mcx 15.12.2004, 21:29
Всем привет!

Проблема вот в чем:

У меня есть массив вот таких значений:

Код

local @items=(
'item1=value1',
'item2=value2',
'item3=value3'
);


ну так вто надо перевести в хэш такого вида:

Код

local %items=(
'item1'=>'value1',
'item2'=>'value2',
'item3'=>'value3',
);


smile

Что посоветуете???

Автор: Гость_mcx 15.12.2004, 21:30
причем забыл нужно не тривиальный способ типа там foreach split etc. а более оригинальный , например, с использованием map но у меня так не получается ))

Автор: chaos 16.12.2004, 12:40
вот тебе примерчик для размышления
%hash = map {getkey($_) => $_ } @array;

Автор: chaos 16.12.2004, 12:55
вот тебе еще готовый пример, может подойдет:
Код

@items=('item1=value1','item2=value2','item3=value3');

%hash = map {getkey($_) => getval($_) } @items;

foreach (keys %hash) {
 print $_." => ".$hash{$_}."\n";
}

sub getkey {
 my $s= $_[0];
 $s=~s/(.+)\=.+/$1/;  
 return $s;
}

sub getval {
 my $s = $_[0];
 $s =~ s/.+\=(.+)/$1/;
 return $s;
}

Добавлено @ 13:01
Цитата
причем забыл нужно не тривиальный способ типа там foreach split etc. а более оригинальный , например, с использованием map но у меня так не получается ))

а чем тебя foreach неустраивает ??

Автор: chaos 16.12.2004, 13:08
Вот еще могу один пример предложить, более компактный и ОРИГИНАЛЬНЫЙ:
Код

@items=('item1=value1','item2=value2','item3=value3');

%hash = map {/(.+)\=(.+)/, $1 => $2 } @items;

while (($k,$v) = each %hash) {
 print "$k => $v\n";
}


ps: за порядок вывода элементов не ручаюсь smile

Автор: Kiber_rat 23.12.2004, 10:17
Думаю такой вариант тоже неплохо смотрится ;)
Код

@items=qw(q=1 w=2 e=3 r=4);
%hash=map {split /=/} @items;
print "$_ = $hash{$_}\n" for sort keys %hash'

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