我是这个领域的新手。所以请好好放轻松。我有两个数组:
@array1 = ("ABC321", "CDB672", "PLE89",....);
@array2 = ("PLE89", "ABC678", "LMD789",...);
我想比较这两个不同数组的元素。但是,我想只用字母匹配字母。因此,例如,如果比较数组,$array[2]
元素(PLE)应与$array2[0]
(PLE)匹配,同样$array1[0]
(ABC)应与$array[1]
(ABC)匹配。我能够一次做到一次,但无法同时比较两个数组的所有元素(即循环数组)。
my ($value1)= ($array[2]=~ /([A-Z]+)[0-9]+/);
print "Value1: $value1 \n";
my ($value2)= ($array[0]=~ /([A-Z]+)[0-9]+/);
print "Value2 : $value2 \n";
if ($value1 eq $value2){
print " length \n";
}
有关如何为两个阵列同时设置循环的任何建议吗?
答案 0 :(得分:4)
您可以使用哈希作为查找设备并获得O(m+n)
解决方案(其中m
是array1的长度,n
是array2的长度。)
#!/usr/bin/perl
use strict;
use warnings;
my @array1 = qw(ABC321 CDB672 PLE89);
my @array2 = qw(PLE89 ABC678 LMD789);
my %seen;
for my $item (@array1) {
die "not a valid item: $item"
unless my ($key) = $item =~ /([A-Z]+)/;
#we are using an array to hold the items in case
#the same key shows up more than once in an array
#this code can be simpler if you can guarantee
#that the keys are unique
push @{$seen{$key}}, $item;
}
for my $item (@array2) {
die "not a valid item: $item"
unless my ($key) = $item =~ /([A-Z]+)/;
if (exists $seen{$key}) {
print "$item is in array1, it matches @{$seen{$key}}\n";
} else {
print "$item is not in array1\n";
}
}
答案 1 :(得分:2)
语言无关的建议是首先对两个数组进行排序(应该使用O(n lg(n)),然后在线性时间内与两个迭代器进行比较。 如果性能不是问题,只需保持简单并使用二次数量的成对比较。 排序时你也可以在最后摆脱数字。