在Perl中,如何在不使用散列的情况下在数组中查找重复值?

在Perl中,如何在不使用散列的情况下在数组中查找重复值?,perl,Perl,可能重复: 在不使用哈希的情况下,查找数组中重复值的最佳方法是什么 @A = ("foo","baz","bar","foo","baz","foo"); 这是我的数组,如何仅提取重复值,如: foo baz 使用“List::MoreUtils” perl -MList::MoreUtils=uniq -e '@A=("foo","baz","bar"","foo");print join " ", uniq(@A),"\n"' foo baz bar 可能有车而且很可能毫无

可能重复:

在不使用哈希的情况下,查找数组中重复值的最佳方法是什么

@A = ("foo","baz","bar","foo","baz","foo");
这是我的数组,如何仅提取重复值,如:

foo baz 使用“List::MoreUtils”

perl -MList::MoreUtils=uniq -e '@A=("foo","baz","bar"","foo");print join " ", uniq(@A),"\n"'     
foo baz bar 

可能有车而且很可能毫无意义:

#!/usr/bin/perl

use strict; use warnings;

my @A = ("foo","baz","bar","foo","baz","foo");
@A = sort @A;

my @duplicates;
my $prev = pop @A;

while (defined(my $x = pop @A)) {
    if ($prev eq $x) {
        push @duplicates, $x;
        while (defined(my $y = pop @A)) {
            if ($y ne $x) {
                $prev = $y;
                last;
            }
        }
    }
    else {
        $prev = $x;
    }
}

use Data::Dumper;
print Dumper \@duplicates;

我不知道为什么您有无散列限制,或者没有外部模块。如果它是标准的Perl模块之一,比如
File::Basename
File::Find
,该怎么办?这些都是标准Perl安装附带的

你能对数组排序吗

my @A = qw(foo baz bar foo baz foo);
my @B = sort @A;
现在
@B
等于
qw*bar baz baz foo foo)
。然后可以遍历此数组,查看前一个值是否等于最后一个值:

my @B = sort @A;
my $previous = pop @B;    #Just to start out:

foreach my $value (@B) {
   if ($previous eq $value) {  #Assuming strings only cause I can't use Scalar::Utils
      print qq("$value" is a duplicate!\n);
   }
   $previous = $value;
}

这将打印出多个
“foo”是重复的
(每个重复一个)。如果你不想这样做,你必须测试一下你以前是否打印过那份声明。

这是家庭作业吗?为什么不想使用散列呢?请参阅此以了解更多信息:[[1]:此答案似乎与您最相关,但您可能需要稍加修改。顺便说一句,这很容易做到,但我看不出重点。任何答案都将是完成此任务的错误方法,除非这是某种形式的家庭作业。这怎么会是重复的?在Perl中查找数组中重复项的所有有效方法都涉及哈希(或
排序
),但如果您不关心效率,
对于我的$i(1..$#A){print$A[$i]if 1==grep$uueq$A[$i],@A[0..$i-1];}
应该可以做得很好。
uniq
使用了散列,因此这不符合问题的要求。问题是要求非唯一元素。@Quentin:很公平,但我看不出OP为什么会在意。@Zaid:Oops。我完全误解了这个问题。我道歉。@James\u R\u弗格森-大概是因为这是一个非真实的世界thx,但我不确定为什么这个代码片段不适用于这个数字数组,当我打印dummper时,它只是打印空数组,检查我的更新,我添加了新数组。我忘记了
其他
my @B = sort @A;
my $previous = pop @B;    #Just to start out:

foreach my $value (@B) {
   if ($previous eq $value) {  #Assuming strings only cause I can't use Scalar::Utils
      print qq("$value" is a duplicate!\n);
   }
   $previous = $value;
}