166

Perlに配列があります:

my @my_array = ("one","two","three","two","three");

配列から重複を削除するにはどうすればよいですか?

4

11 に答える 11

173

perlfaq4で示されているように、次のようなことができます:

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}

my @array = qw(one two three two three);
my @filtered = uniq(@array);

print "@filtered\n";

出力:

one two three

モジュールを使用する場合は、uniqから機能を試してくださいList::MoreUtils

于 2008-08-11T10:16:22.770 に答える
125

Perlのドキュメントには、FAQのすばらしいコレクションが付属しています。あなたの質問はよく聞かれます:

% perldoc -q duplicate

上記のコマンドの出力からコピーして貼り付けた答えは、以下に表示されます。


/usr/local/lib/perl5/5.10.0/pods/perlfaq4.podにあります

リストまたは配列から重複する要素を削除するにはどうすればよいですか? (brian d foyによる寄稿)

ハッシュを使用します。「ユニーク」または「重複」という言葉を考えるときは、「ハッシュキー」を考えてください。

要素の順序を気にしない場合は、ハッシュを作成してからキーを抽出するだけです。そのハッシュをどのように作成するかは重要ではありません。「キー」を使用して一意の要素を取得するだけです。

   my %hash   = map { $_, 1 } @array;
   # or a hash slice: @hash{ @array } = ();
   # or a foreach: $hash{$_} = 1 foreach ( @array );

   my @unique = keys %hash;

モジュールを使用する場合は、「List::MoreUtils」の「uniq」関数を試してください。リストコンテキストでは、一意の要素を返し、リスト内の順序を保持します。スカラーコンテキストでは、一意の要素の数を返します。

   use List::MoreUtils qw(uniq);

   my @unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 1,2,3,4,5,6,7
   my $unique = uniq( 1, 2, 3, 4, 4, 5, 6, 5, 7 ); # 7

また、各要素を調べて、前に見た要素をスキップすることもできます。追跡するためにハッシュを使用します。ループが要素を初めて見たとき、その要素は%Seenにキーを持っていません。「next」ステートメントはキーを作成し、すぐにその値「undef」を使用するため、ループは「push」に進み、そのキーの値をインクリメントします。次回ループが同じ要素を検出すると、そのキーはハッシュに存在し、そのキーの値はtrue(0または "undef"ではないため)であるため、nextはその反復をスキップし、ループは次の要素に進みます。

   my @unique = ();
   my %seen   = ();

   foreach my $elem ( @array )
   {
     next if $seen{ $elem }++;
     push @unique, $elem;
   }

同じことを行うgrepを使用して、これをより簡単に記述できます。

   my %seen = ();
   my @unique = grep { ! $seen{ $_ }++ } @array;
于 2008-08-11T14:27:46.150 に答える
70

List::MoreUtilsを CPAN からインストールする

次に、コードで:

use strict;
use warnings;
use List::MoreUtils qw(uniq);

my @dup_list = qw(1 1 1 2 3 4 4);

my @uniq_list = uniq(@dup_list);
于 2008-08-31T10:01:18.683 に答える
24

これを行う私の通常の方法は次のとおりです。

my %unique = ();
foreach my $item (@myarray)
{
    $unique{$item} ++;
}
my @myuniquearray = keys %unique;

ハッシュを使用し、アイテムをハッシュに追加する場合。また、各アイテムがリストに表示される回数を知るというボーナスもあります.

于 2008-08-11T10:18:45.090 に答える
10

単純なPerlワンライナーで実行できます。

my @in=qw(1 3 4  6 2 4  3 2 6  3 2 3 4 4 3 2 5 5 32 3); #Sample data 
my @out=keys %{{ map{$_=>1}@in}}; # Perform PFM
print join ' ', sort{$a<=>$b} @out;# Print data back out sorted and in order.

PFMブロックはこれを行います:

のデータ@inはに供給されmapます。map匿名ハッシュを作成します。 keysハッシュから抽出され、にフィードされます@out

于 2011-11-09T21:23:25.667 に答える
8

変数@arrayは要素が重複しているリストです

%seen=();
@unique = grep { ! $seen{$_} ++ } @array;
于 2010-10-23T16:18:36.777 に答える
4

あのラストはかっこよかった。少し微調整します:

my @arr;
my @uniqarr;

foreach my $var ( @arr ){
  if ( ! grep( /$var/, @uniqarr ) ){
     push( @uniqarr, $var );
  }
}

これがおそらく最も読みやすい方法だと思います。

于 2009-01-23T23:35:59.633 に答える