Perl数组元素比较

时间:2015-08-12 08:57:56

标签: arrays perl

我是Perl编程的新手。我试图比较每个元素的两个数组。所以这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use v5.10.1;

my @x = ("tom","john","michell");
my @y = ("tom","john","michell","robert","ricky");
if (@x ~~ @y)
{
    say "elements matched"; 
}
else 
{ 
    say "no elements matched";
}

当我运行时,我得到了输出 no elements matched

所以我想深入比较两个数组元素,并且元素不匹配,我想将它们存储在一个新数组中。因为我现在可以比较唯一匹配的元素,但我无法将其存储在新数组中。

如何将这些不匹配的元素存储在新数组中?

请有人帮助我并提供建议。

2 个答案:

答案 0 :(得分:5)

我会在Perl中避免智能匹配 - 例如见here

如果您尝试将$y[0]的内容与$x[0]进行比较,那么这是一种方法,将所有不匹配放在新数组@keep中:

use strict;
use warnings;
use feature qw/say/;

my @x = qw(tom john michell);
my @y = qw(tom john michell robert ricky);

my @keep;
for (my $i = 0; $i <$#y; $i++) {
    unless ($y[$i] eq $x[$i]){
        push @keep, $y[$i];
    }
}

say for @keep;

或者,如果您只想查看另一个数组中是否存在一个名称 (并且对直接比较元素不感兴趣),请使用两个哈希:< / p>

my (%x, %y);

$x{$_}++ for @x;
$y{$_}++ for @y;

foreach (keys %y){
    say if not exists $x{$_};
}

答案 1 :(得分:1)

在花费一些时间阅读Perl FAQ时,这是非常值得的。

Perl FAQ 4涉及数据操作,包括以下问题和答案:

  

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

     

使用哈希。这是两个以上的代码。它假定每个   element在给定数组中是唯一的:

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   操作