重複値の削除
データを一度ハッシュに格納することで、重複値を削除できます。
データの出現順を保持する場合は、最初にハッシュに入れる時だけデータを取り出すようにします。
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関数
・配列から値を削除
