目标:匹配两个数组并找到匹配元素的索引位置。
棘手的部分:根据下面给出的例子,每个数组的元素并不完全相似,但是包含某些部分,我希望与之匹配。
数组如何:
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;
我知道这将是一件非常容易的事情,我错过了。但请告诉我我能做些什么。
答案 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";
}
}