重複値の削除


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