重複値の削除
データを一度ハッシュに格納することで、重複値を削除できます。
データの出現順を保持する場合は、最初にハッシュに入れる時だけデータを取り出すようにします。
use strict; use warnings; my @data = qw(aa dd bb cc dd cc bb aa); print '@data', "\n"; print_array(@data); print "\n"; # 順番を気にしないその1 my %uniq = map {$_ => 1} @data; my @data2_1 = keys %uniq; print '@data2_1', "\n"; print_array(@data2_1); print "\n"; # 順番を気にしないその2 my @data2_2 = keys %{{ map {$_ => 1} @data }}; print '@data2_2', "\n"; print_array(@data2_2); print "\n"; # 出現順に格納するその1 my @data3_1 = (); my %check = (); foreach my $val (@data) { unless (exists $check{$val}) { push @data3_1, $val; $check{$val} = 1; } } print '@data3_1', "\n"; print_array(@data3_1); print "\n"; # 出現順に格納するその2 my @data3_2 = do { my %c; grep {!$c{$_}++} @data }; print '@data3_2', "\n"; print_array(@data3_2); print "\n"; # 配列の中身を表示する sub print_array { my @data = @_; print join(',', @data), "\n"; }List::MoreUtilsモジュールを使う方法もあります。出現順を保持します
use strict; use warnings; use List::MoreUtils; my @data = qw(aa dd bb cc dd cc bb aa); print '@data', "\n"; print_array(@data); print "\n"; my @data2 = List::MoreUtils::uniq @data; print '@data2', "\n"; print_array(@data2); print "\n"; # 配列の中身を表示する sub print_array { my @data = @_; print join(',', @data), "\n"; }Array::Uniqモジュールを使う方法もあります。sortと組み合わせて使う必要がありますので、出現順は保持しません。
use strict; use warnings; use Array::Uniq; my @data = qw(aa dd bb cc dd cc bb aa); print '@data', "\n"; print_array(@data); print "\n"; my @data2 = uniq sort @data; print '@data2', "\n"; print_array(@data2); print "\n"; # 配列の中身を表示する sub print_array { my @data = @_; print join(',', @data), "\n"; }
関連項目
・keys関数・grep関数
・map関数
・sort関数
・配列から値を削除