Perl: получить параллельное значение в массиве хэшей - PullRequest
1 голос
/ 25 ноября 2010

У меня есть это:

my(%arr) = (
 monsters => ["Test","Test2"],
 kills    => [-1,    -2     ]);

Потом я ищу Test2:

 if ( grep { $_ eq "Test2"} @{ $arr{monsters} } )
 {
   #Get parallel value of Test2 (-2)
   next;
 }

Как получить параллельное значение, не зная индекса (при поиске используется фактическая переменная, а не строковый литерал)?

Ответы [ 2 ]

5 голосов
/ 25 ноября 2010

Вместо использования grep просто зациклите массив и сохраните переменную count:

for my $idx( 0 .. $#{ $arr{monsters} } ) { 
    if ( $arr{monsters}[$idx] eq 'Test2' ) { 
        print "Kills = $arr{kills}[$idx]\n";
        last;
    }
}

Однако лучшим способом справиться с этим может быть переосмысление структуры данных. Вместо параллельных массивов рассмотрим массив хэшей:

my @monsters = ( { name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 } );

Теперь, чтобы найти конкретного монстра:

my ( $monst ) = grep { $_->{name} eq 'Test2' } @monsters;
print $monst->{kills};

Это позволит вам выполнять поиск по имени и одинаково легко убивать. Если вы всегда будете искать по имени, то лучше было бы создать хеш с именем и указать количество убийств (как подсказывает @dmah).

Еще лучший способ справиться с этим - заключить монстров в класс и заставить каждый объект отслеживать свои собственные убийства, но я оставлю это в качестве упражнения для ОП.

4 голосов
/ 25 ноября 2010

Попробуйте хэш хэшей:

my %arr = (
  'Test' => {
     'kills' => -1,
   },
  'Test2' => {
     'kills' => -2,
   },
);

print $arr{'Test2'}{'kills'}, "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...