Arrays Perl:在哈希数组中获取并行值

Arrays Perl:在哈希数组中获取并行值,arrays,perl,parallel-processing,Arrays,Perl,Parallel Processing,我有这个: my(%arr) = ( monsters => ["Test","Test2"], kills => [-1, -2 ]); 然后,稍后我搜索Test2: if ( grep { $_ eq "Test2"} @{ $arr{monsters} } ) { #Get parallel value of Test2 (-2) next; } 如何在不知道索引的情况下获得并行值(搜索时使用的是实际变量,而不是字符串文字)?尝试散

我有这个:

my(%arr) = (
 monsters => ["Test","Test2"],
 kills    => [-1,    -2     ]);
然后,稍后我搜索Test2:

 if ( grep { $_ eq "Test2"} @{ $arr{monsters} } )
 {
   #Get parallel value of Test2 (-2)
   next;
 }
如何在不知道索引的情况下获得并行值(搜索时使用的是实际变量,而不是字符串文字)?

尝试散列:

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

print $arr{'Test2'}{'kills'}, "\n";
my @monsters = ( { name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 } );
尝试散列:

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

print $arr{'Test2'}{'kills'}, "\n";
my @monsters = ( { name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 } );

不要使用
grep
,只需在数组上循环并保留一个计数变量:

for my $idx( 0 .. $#{ $arr{monsters} } ) { 
    if ( $arr{monsters}[$idx] eq 'Test2' ) { 
        print "Kills = $arr{kills}[$idx]\n";
        last;
    }
}
然而,更好的处理方法可能是重新考虑您的数据结构。代替并行数组,考虑哈希数组:

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

print $arr{'Test2'}{'kills'}, "\n";
my @monsters = ( { name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 } );
现在,要查找特定的怪物:

my ( $monst ) = grep { $_->{name} eq 'Test2' } @monsters;
print $monst->{kills};
这将允许您按名称搜索,并同样轻松地杀死。如果你总是要按名字搜索,那么在名字上做一个哈希键并指向杀死的数量(正如@dmah所建议的)可能会更好


处理这个问题的更好方法是将你的怪物封装在一个类中,让每个对象记录自己的杀死情况,但我将把它作为操作练习。

而不是使用
grep
,只需在数组上循环并保留一个计数变量:

for my $idx( 0 .. $#{ $arr{monsters} } ) { 
    if ( $arr{monsters}[$idx] eq 'Test2' ) { 
        print "Kills = $arr{kills}[$idx]\n";
        last;
    }
}
然而,更好的处理方法可能是重新考虑您的数据结构。代替并行数组,考虑哈希数组:

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

print $arr{'Test2'}{'kills'}, "\n";
my @monsters = ( { name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 } );
现在,要查找特定的怪物:

my ( $monst ) = grep { $_->{name} eq 'Test2' } @monsters;
print $monst->{kills};
这将允许您按名称搜索,并同样轻松地杀死。如果你总是要按名字搜索,那么在名字上做一个哈希键并指向杀死的数量(正如@dmah所建议的)可能会更好


处理这个问题的更好方法是将你的怪物封装在一个类中,让每个对象都记录自己的杀死情况,但我将把它作为一个练习留给OP。

如何循环打印它?没关系,我想我明白了:while($k,$v)=each%arr){print“$k=>”,$arr{k}{“kills”},\n”}当然或者类似的东西:foreach(排序键%arr){print“${arr{{kills'}\n”}foreach(排序{$arr{$a}{kills'}$a}}}}$$b}{kills'}}}}键%arr){print“${arr=$arr}如何循环打印它?没关系,我想我明白了:while($k,$v)=each%arr){print“$k=>”,$arr{k}{“kills”},\n”}当然或者类似的东西:foreach(排序键%arr){print“${print”${arr{kills'}\n”}foreach(排序{$arr{$a}{kills'}$$a}}}{kills'}$arr}}$$b}}{kills}}}}键%arr){print“${arr=$arr}