#!usr/bin/perl -W
use strict;
my @a = (3,5,8,6,7,9);
my @b = (3,7,8);
my @index;
my $match;
foreach my $i (0 .. $#a) {
$match = 0;
foreach my $j (0 .. $#b) {
if ($a[$i] == $b[$i]) {
$match = 1;
push (@index, $j);
last;
}
}
if ($match == 1) {
print "the values which got matched are $a[$i] at a and index is $i\n";
}
}
print "the index of b matched is @index";
嗨,我想获取数组元素匹配的索引和值。
my @a=(3,5,8,6,7,9);
my @b=(5,9,3);
我想比较@a和@b并从a获取匹配值的索引。 (比较值,ia) 输出为类似这样的内容([5,9,3],[1,5,0])。 b值5与索引1中的a匹配。
有人可以帮我吗?我试图首先获取匹配的数组元素,并在找到匹配项时推送索引。但是没有得到预期的结果。
答案 0 :(得分:1)
您的代码中有一个非常简单的错字。
# V
if ($a[$i] == $b[$i]) {
$match = 1;
# V
push (@index, $j);
last;
}
您正在使用$i
中当前元素的@a
索引来每次访问@b
中的相同值,然后按下从未使用过的$j
比较。您需要将$a[$i]
与$b[$j]
进行比较。换一个字母就能使程序正常工作。
if ($a[$i] == $b[$j]) {
$match = 1;
push (@index, $j);
last;
}
您的实现效率很低。您要做的是从@b
中查找@a
中的内容。一种简单的方法是建立一个查找哈希(或一个 index ,例如电话簿侧面的字母)。
use strict;
use warnings;
use 5.012; # for say and each on array
my @a = ( 3, 5, 8, 6, 7, 9 );
my @b = ( 5, 9, 3 );
my @index;
my $match;
my %index_of_a;
while ( my ( $index, $value ) = each @a ) {
$index_of_a{$value} = $index; # will overwrite
}
foreach my $value (@b) {
if ( exists $index_of_a{$value} ) {
say "The index of '$value' in \@a is '$index_of_a{$value}'";
}
}
代码遍历@a
的值。它使用array form of each
1 ,它是Perl 5.12中添加的。然后将它们按值放入哈希中,以便在知道值时可以查找索引。
然后我们迭代@b
中的值,并检查我们的哈希中是否有@a
的当前值索引。
输出看起来像这样
The index of '5' in @a is '1'
The index of '9' in @a is '5'
The index of '3' in @a is '0'
如果一个值在@a
中存在多次,则将使用最后一次出现的值。我的代码无法跟踪何时匹配@b
的哪个索引。我会留给你的。
1)虽然我通常不喜欢使用each
,但是对于同时需要值和索引的数组,我发现它比C风格的{{1} }循环。