如何将两个数组与字母数字元素进行比较?

时间:2014-08-18 17:44:16

标签: perl

我有两个我要比较的数组

 @array1 = ( aaa, bbb, aaabbb, aaa23bbb, ddd555, 430hd9789);

 @array2 = ( 34322hh2, jjfjr78, uuu7shv, ddd555, hjkdjroo);

我必须比较这两个数组并找到重复数据并对其做些什么。

条件:

  1. 数组中每个元素的长度可以不同。没有这样的固定模式。

  2. 元素可以只是数字,即334343,或者只是char,即#34; somewordexample",或者它可以是字母数字,即wewe83493

  3. 数组中可以有更多这样的元素。

  4. 现在我知道有关比较运算符==eq的以下内容:

    ==用于比较数字

    eq用于字符串比较

    如何比较字母数字值?

    这是我目前的代码

    for (my $i = 0 ; $i <= $#array1 ; $i++ ) {
      for (my $j = 0 ; $j <= $#array2 ; $j++ ) {
        if ( $array1[$i] == $arra2[$j] ) {
          print "duplicate";
        }
      }
    }
    

5 个答案:

答案 0 :(得分:3)

你的态度是懒散的,你似乎在寻找一个快速解决方案而不关心你是否理解解决方案。 Stack Overflow上的帖子主要针对可能有类似问题的发起人以外的其他人。

您应该阅读perlfaq4。具体做法是:

  • perldoc -q intersection - “如何计算两个数组的差异?如何计算两个数组的交集?”

  • perldoc -q contained - “如何判断某个元素是否包含在列表或数组中?”

  • perldoc -q duplicate - “如何从列表或数组中删除重复的元素?”

答案 1 :(得分:2)

感谢您发布行为不当的代码。

有一些问题

  • 您必须始终 use strictuse 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 $ /) {....}