避免list :: utils的另一个数组中一个数组的元素索引

时间:2017-07-27 14:09:51

标签: arrays perl

  

目标:匹配两个数组并找到匹配元素的索引位置。

     

棘手的部分:根据下面给出的例子,每个数组的元素并不完全相似,但是包含某些部分,我希望与之匹配。

数组如何:

array1=('adam west', 'daric dalon','tom helic','todd nick','riley remer'); 

array2=('adam west 12', 'daric dalon mr.','tom helic (fads)','todd nick (456)','riley remer','john steve','dim madz 12');

我尝试过使用List::MoreUtils qw(first_index);方法,但这种方法并没有给出我想要的效果。

以下我尝试过:

尝试1

for my $name (@Names) {
    $count;
    for $matchList (@org_name) {
        if ( index( $matchList, $name ) != -1 ) {
            push (@matched,$matchList);
            $count++;
            }#print $org_name[$count];
    }
} print "Those which are matched @matched\n";

尝试2

我从网上复制的下一个方法,但不是很有用。

use List::MoreUtils qw(first_index);
@indexes;

foreach my $place (@allNames) {
    push @indexes, first_index { $_ eq $place } @org_name;
}
use Data::Dumper qw(Dumper);
print Dumper \@indexes;

我知道这将是一件非常容易的事情,我错过了。但请告诉我我能做些什么。

2 个答案:

答案 0 :(得分:2)

我认为你需要这样的东西:

use Data::Dumper

my @indexes = ();
#create hash of "first_index" elemets in @org_name
my %tmp = map { $org_name[$_] => $_ } reverse 0..$#org_name;

for my $t (@allNames) {
    if(exists($tmp{$t})) {
        push @indexes, $tmp{$t};
    }
}

print Dumper @indexes;

答案 1 :(得分:2)

 if ( index( $matchList, $name ) != -1 ) {

你还没有解释你的意思"匹配两个阵列"。我想你可能正在寻找两个数组中的元素。但上面的这一行并没有测试两个字符串的相等性,它正在测试$name是否显示为$matchList的子字符串。这就是你想要的吗?

如果你想测试相等性,你应该使用它:

 if ($matchList eq $name) {

但是如果字符串相等,子字符串检查仍然有用。如果它们不匹配,那么听起来您的数组不包含您认为它们包含的内容。也许一个数组包含仍然附加换行符的元素 - 或类似的东西。

如果你真的试图找到两个数组中出现的元素,那么(通常就是这种情况)Perl FAQ会很有用。您正在寻找两个集合的交集,perlfaq4包含以下内容:

  

如何计算两个数组的差异?我该如何计算   两个数组的交集?

     

使用哈希。这里有两个代码和   更多。它假定每个元素在给定数组中是唯一的:

my (@union, @intersection, @difference);
my %count = ();
foreach my $element (@array1, @array2) { $count{$element}++ }
foreach my $element (keys %count) {
    push @union, $element;
    push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
}
     

请注意,这是对称差异,即A或B中的所有元素,但两者都不是。把它想象成一个xor操作。

更新:看过你想要的东西,我上面提到的大部分内容完全偏离主题。提问时请尽量清楚。

你真正想要的是这样的:

#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

my @arr1 = ('adam west', 'daric dalon', 'tom helic','todd nick', 'riley remer');
my @arr2 = ('adam west 12', 'daric dalon mr.','tom helic (fads)',
            'todd nick (456)', 'riley remer', 'john steve', 'dim madz 12');

# Match elements from array1 ...
for my $e1 (@arr1) {
  # ... against indexes in array2
  for my $i2 (0 .. $#arr2) {
    if ($arr2[$i2] =~ /^\Q$e1/) {
      say "$e1 -> $i2";
    }
  }
}

或者您可以像这样使用List::MoreUtils::firstidx

#!/usr/bin/perl

use strict;
use warnings;

use List::MoreUtils 'firstidx';

use feature 'say';

my @arr1 = ('adam west', 'daric dalon', 'tom helic','todd nick', 'riley remer');
my @arr2 = ('adam west 12', 'daric dalon mr.','tom helic (fads)',
            'todd nick (456)', 'riley remer', 'john steve', 'dim madz 12');

# Match elements from array1 ...
for my $e1 (@arr1) {
  # ... against indexes in array2
  if ((my $i2 = firstidx { /^\Q$e1/ } @arr2) == -1) {
    say "$e1 not found in \@arr2";
  } else {
    say "$e1 -> $i2";
  }
}