【问题标题】:I am unable to remove duplicates from my array , just getting the last element of the array我无法从数组中删除重复项,只能获取数组的最后一个元素
【发布时间】:2011-07-18 18:58:26
【问题描述】:

我知道有一个类似的问题,但我从那里获取了提示并应用于我的代码以删除重复项。我得到的只是数组的最后一个元素。我看不出哪里出错了。请帮我找出我哪里出错了。

use strict;
use warnings;
use File::Find;
use Data::Dumper;
use List::MoreUtils qw/ uniq /;

my $localdir = 'images/p/';
my @filefound;
my @split1;
my $before;

find(sub {push @filefound, $File::Find::name if /.jpg$/ },$localdir);

for(@filefound) { print "$_ \n";}

foreach (@filefound){
my @result = split('_',$_);
@split1 = $result[0];
}

my %unique = ();
foreach my $item (@split1)
{ 
    $unique{$item} ++;
}

my @myuniquearray = keys %unique;
foreach (@myuniquearray){ print "$_  \n";}

【问题讨论】:

  • my @myuniquearray = grep { $unique{$_} == 1 } keys %unique
  • 打印时我仍然得到最后一个元素! :(
  • 当然可以。在循环中,每次迭代都会覆盖数组,所以当然只保存最后一次覆盖。 @split1 = $result[0]; 因此我之前对push的评论
  • 是的,我得到了那个,谢谢!

标签: arrays perl duplicates unique duplicate-removal


【解决方案1】:

问题出在这里:

foreach (@filefound){
    my @result = split('_',$_);
    @split1 = $result[0];
}

您每次通过循环重新分配@split1。尝试push @split1, $result[0]; 将新元素推送到现有列表中。

【讨论】:

    【解决方案2】:

    在第一个 foreach 中,您将在每次迭代中覆盖 @split1,而不是将结果添加到列表中。

    【讨论】:

      【解决方案3】:

      @split1 = $result[0]; 那里的数组中只有一个元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 2019-09-08
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        • 2014-12-09
        相关资源
        最近更新 更多