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


Автор: meridian 26.2.2014, 12:27
Коллеги, добрый день!
Есть хэш

Код

%hash=( 'k1' => 'var1, var2',
        'k2' => 'var3',  var6'
    'k3' => 'var4, var5'
);

foreach my $rec ( sort keys %hash )
{
    printf "$hash{$rec}\n";
}



Получаем 
var1, var2
var3, var6
var4, var5

Подскажите плиз, можно ли реализовать цикл только по первым значениям хэша, т.е. var1, var3, var4 ?
Спасибо!

Автор: Bulat 26.2.2014, 12:47
Цитата(meridian @  26.2.2014,  12:27 Найти цитируемый пост)
Подскажите плиз, можно ли реализовать цикл только по первым значениям хэша, т.е. var1, var3, var4 ?


sort values

при этом необходимо задать свою функцию сортировки.

Например:

Код

my %hash = ( 
  'k1' => 'var1, var2',
  'k2' => 'var7, var6',
  'k3' => 'var4, var5'
);

foreach my $rec ( sort by_first_var values %hash )
{
    printf "$rec\n";
}

sub by_first_var {
  ($a =~ /^var(\d)/)[0] <=> ($b =~ /^var(\d)/)[0]
}

Автор: Jimy 26.2.2014, 12:49
Если хэш формируется выше по коду, то можно сформировать его подходящим образом, например так
Код

%hash=(
'k1' => ['var1', 'var2'],
'k2' => ['var3', 'var6'],
'k3' => ['var4', 'var5']
);

и тогда в цикле получить первое значение можно так
Код

foreach my $rec ( sort keys %hash )
{
    printf "$hash{$rec}[0]\n";
}

Если же нет возможности повлиять на формирование этой структуры, тогда нужно разбивать строку, как-то так:
Код

foreach my $rec ( sort keys %hash )
{
    my @values = split(/\,\s*/, $hash{$rec});
    printf "$values[0]\n";
}

Автор: meridian 26.2.2014, 12:59
Спасибо!

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