Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование в *nix (http://forum.oszone.net/forumdisplay.php?f=35)
-   -   PERL многомерный хэш. Вывести первый ключ (http://forum.oszone.net/showthread.php?t=309320)

Тишина 17-12-2015 16:48 2585798

PERL многомерный хэш. Вывести первый ключ
 
Допустим у нас есть многомерный %hash
Код:

my %hash;

$hash{car}{old}=1200;
$hash{car}{new}=1300;
$hash{car}{sold}=1000;

$hash{ball}{old}=120;
$hash{ball}{new}=0;
$hash{ball}{sold}=1000;

нужно получить ключ-1 ('ball') по паре ключ-2=значение ('old'=120). можно ли это сделать короткой записью, без перебора всех ключей?

Ardenen 19-05-2017 01:14 2737918

Порядок подхэшей (old, new, sold) по умолчанию не сохраняется.
Код:

my %hash;

$hash{'car'}{'old'}=1200;
$hash{'car'}{'new'}=1300;
$hash{'car'}{'sold'}=1000;

$hash{'ball'}{'old'}=120;
$hash{'ball'}{'new'}=0;
$hash{'ball'}{'sold'}=1000;

for (keys %{$hash{'ball'}}) { print "$_\n" }


Тишина 19-05-2017 13:41 2738031

** конечная задача была уже решена год с лишним назад, и, вроде, там решил по-другому организовывать данные. так что решение носит только характер "а интересно как/возможно ли"

это понятно, но интересовало другое. я хотел достать ключ-1, зная ключ-2 и его значение

вообще получается такой алгоритм:

Код:

my $found_key;
foreach my $key(keys %hash) {
  if ($hash{$key}{old} eq 120) {
      $found_key = $key;
      break;
  }
}

я искал вариант как раз без перебора всех ключ-1.

Ardenen 19-05-2017 14:43 2738044

Во первых не break, а last, во вторых такое лучше сделать grep'ом:
Код:

my $found_key = (grep { $hash{$_}{'old'} eq 120 } (keys %hash))[0];

Тишина 01-06-2017 14:10 2741333

Цитата:

Цитата Ardenen
Во первых не break, а last, во вторых такое лучше сделать grep'ом:
Код:
my $found_key = (grep { $hash{$_}{'old'} eq 120 } (keys %hash))[0]; »

вот, то что нужно было =) не вкурсе, быстрее ли работать будет, но то что запись минималистичней - точно, а это уже радует =)

p.s. возьму на заметку!


Время: 10:39.

Время: 10:39.
© OSzone.net 2001-