我有两个我要比较的数组
@array1 = ( aaa, bbb, aaabbb, aaa23bbb, ddd555, 430hd9789);
@array2 = ( 34322hh2, jjfjr78, uuu7shv, ddd555, hjkdjroo);
我必须比较这两个数组并找到重复数据并对其做些什么。
条件:
数组中每个元素的长度可以不同。没有这样的固定模式。
元素可以只是数字,即334343,或者只是char,即#34; somewordexample",或者它可以是字母数字,即wewe83493
数组中可以有更多这样的元素。
现在我知道有关比较运算符==
和eq
的以下内容:
==
用于比较数字
eq
用于字符串比较
如何比较字母数字值?
这是我目前的代码
for (my $i = 0 ; $i <= $#array1 ; $i++ ) {
for (my $j = 0 ; $j <= $#array2 ; $j++ ) {
if ( $array1[$i] == $arra2[$j] ) {
print "duplicate";
}
}
}
答案 0 :(得分:3)
你的态度是懒散的,你似乎在寻找一个快速解决方案而不关心你是否理解解决方案。 Stack Overflow上的帖子主要针对可能有类似问题的发起人以外的其他人。
您应该阅读perlfaq4
。具体做法是:
perldoc -q intersection
- “如何计算两个数组的差异?如何计算两个数组的交集?”
perldoc -q contained
- “如何判断某个元素是否包含在列表或数组中?”
perldoc -q duplicate
- “如何从列表或数组中删除重复的元素?”
答案 1 :(得分:2)
感谢您发布行为不当的代码。
有一些问题
您必须始终 use strict
和use warnings
位于每个Perl程序的顶部,并声明每个变量尽可能接近其第一个使用点。这个简单的措施将为您揭示许多您可能忽视的错误
我使用qw
来定义数组数据
使用Perl foreach
比使用C风格for
正如您似乎发现的那样,==
运算符用于比较数字。您有字符串,因此需要eq
除此之外,我在代码中所做的更改都是提及重复条目的文本,而不仅仅是打印“duplicate”
use strict;
use warnings;
my @array1 = qw( aaa bbb aaabbb aaa23bbb ddd555 430hd9789 );
my @array2 = qw( 34322hh2 jjfjr78 uuu7shv ddd555 hjkdjroo );
for my $i (0 .. $#array1) {
for my $j (0 .. $#array2) {
if ( $array1[$i] eq $array2[$j] ) {
print "Duplicate '$array1[$i]'\n";
}
}
}
<强>输出强>
Duplicate 'ddd555'
答案 2 :(得分:1)
您的字母数字值仍可视为字符串。如果要查找列表中的元素,可以使用List::Compare模块提供的get_intersection
函数:
use strict;
use warnings;
use List::Compare;
my @array1 = qw(aaa bbb aaabbb aaa23bbb ddd555 430hd9789);
my @array2 = qw(34322hh2 jjfjr78 uuu7shv ddd555 hjkdjroo);
my $comp = List::Compare->new(\@array1, \@array2);
my @duplicates = $comp->get_intersection();
if (@duplicates > 0) {
print "@duplicates\n";
}
输出:
ddd555
答案 3 :(得分:1)
字母数字值只是字符串。数值是Perl认为是数字的子集(即Scalar :: Util :: looks_like_number()返回true)。在这种情况下,您可以使用eq
或任何其他与字符串相关的函数进行比较(例如不太常用的index
)。
在O(n)时间
中找到确切的重复项my %seen;
for my $duplicate (grep { ++$seen{$_} > 1 } (@array1, @array2))
{
# Do what you need to do to the duplicates
}
如果你只是想摆脱@ array2中重复的@ array1元素,
my %seen = map { $_ => 1 } @array2;
@array1 = grep { not $seen{$_} } @array1;
答案 4 :(得分:-2)
您可以使用完全匹配的正则表达式执行此操作:
if(“4lph4”=〜/ ^ 4lph4 $ /) {....}