【问题标题】:Perl array element comparingPerl 数组元素比较
【发布时间】:2018-06-16 14:58:36
【问题描述】:

我是 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

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

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

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

【问题讨论】:

  • @array1 ~~ @array2 检查每个索引是否与另一个数组中的相同索引匹配。正如perlop 文档所说,它就像($array1[0] ~~ $array2[0]) && ($array1[1] ~~ $array2[1]) && ... 等。最终,您的 else 语句是错误的,应该说“部分或所有元素不匹配”。做你想做的事情的唯一方法是创建一个查找表(哈希)或在另一个数组上迭代一个数组......这两者都已经作为答案提供了。
  • Array::Compare 非常适合您的问题。 search.cpan.org/~davecross/Array-Compare-2.11/lib/Array/… 可以列出不匹配的元素。
  • 为了澄清你的问题......你想在两个数组中比较相同的索引吗?那就是...如果tom$x[0] 中但在$y[1]... 或... 必须tom$x[0]$y[0] 中,这有关系吗?
  • 不,我没有比较两个索引..
  • 您应该避免使用智能匹配。这是一个实验性功能,有点破损,很可能在 Perl 的未来版本中发生变化

标签: arrays perl


【解决方案1】:

我会避免在 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;

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

my (%x, %y);

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

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

【讨论】:

  • 感谢您对我的回答的评论。我没有清楚地阅读这个问题。然后我尝试了否定智能匹配不起作用。
  • 第一种方式我只能得到一个元素..而我想得到 2 个元素?
  • 那是因为两个数组的元素个数不相等。
【解决方案2】:

花些时间阅读Perl FAQ 非常值得。

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

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

使用哈希。这是可以同时执行更多操作的代码。它假设每个 元素在给定数组中是唯一的:

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 中,但不是在两者中。把它想象成一个异或 操作。

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 2010-11-07
    • 2016-03-25
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    相关资源
    最近更新 更多