如何比较行中2个数组的元素

时间:2012-11-17 07:15:07

标签: perl

我有2个数组(@curNodes@oldNodes),数组的元素在行中。 例如:

Output of print @curNodes   Output of print @oldNodes  
US                          London
UK                          US

现在我想将@curNodes的每个元素与@oldNodes进行比较。 例如,它会检查"US"中的@oldNodes,如果它什么都不做的话 其他一些其他行动。

请你帮我,让我知道元素是否排成一行, 如何进行这种比较。

4 个答案:

答案 0 :(得分:5)

对于不需要任何外部模块的方法,如何将第一个数组转换为哈希值,然后迭代第二个数组呢?见下文。

use v5.012;
use warnings;

my @old_nodes = qw/ a b c d /;
my %old = map {; $_ => 1 } @old_nodes;

my @cur_nodes = qw/ a d /;

foreach (@cur_nodes) {
    if ($old{$_}) {
        say "$_ exists in old_nodes";
    }
}

答案 1 :(得分:3)

您可以使用 Array :: Diff 模块。

答案 2 :(得分:2)

您可以使用智能匹配运算符(~~)来执行此操作。

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my @curNodes = qw' US UK ';
my @oldNodes = qw' London US ';

my $flag;

foreach my $item (@curNodes) {
  $flag = @oldNodes~~$item ? 0 : 1;
  last if !$flag; #perform some action
}

答案 3 :(得分:0)

我们在Perl中确实没有多维数组。 但肯定有阵列引用数组。

假设您正在运行Perl 5.10或更新版本,我认为smartmatch运算符是有意义的。

根据您的描述,这是我想出的:

#!/usr/bin/perl -Tw

use 5.010;
use strict;
use warnings;
use Data::Dumper;

my @curNodes = (
    [ 'US', 'UK' ],
);

my @oldNodes = (
    [ 'London',  'US' ],
);

my @matchedElements = grep { $_ ~~ @{ $oldNodes[0] } } @{ $curNodes[0] };

say Dumper( \@curNodes );
say Dumper( \@oldNodes );
say Dumper( \@matchedElements );

这会发出:

$VAR1 = [
          [
            'US',
            'UK'
          ]
        ];

$VAR1 = [
          [
            'London',
            'US'
          ]
        ];

$VAR1 = [
          'US'
        ];

我想你想在你的程序中迭代@matchedElements。