第37回 Perlで小技5

○ 配列からユニークなものだけ取り出す

配列からユニークなものを取得したいときは、ハッシュを使えばよい。
(いろんなページでソースが載っていますね)

ソース1

use strict;
use Data::Dumper;

my @c = qw(aa bb cc dd aa cc ee ff gg ff);

my %d;
$d{$_}++ for @c;
my @e = keys %d;

print "@e", "\n";

結果:

gg cc ff bb dd aa ee

参考:ビンゴ中西のほげほげq qq qw

ユニークにするところをワンライナーで書くなら

さしずめこんなところだろうか

ソース2

use strict;
use Data::Dumper;

my @c = qw(aa bb cc dd aa cc ee ff gg ff);

my @e = keys %{{map { $_ => 1 } @c}};
print "@e", "\n";

結果

gg cc ff bb dd aa ee

参考資料:配列からユニークな要素の取り出し

○ 配列に値が何個ずつ入っているか調べる

my @c = qw(aa bb cc dd aa cc ee ff gg ff);

という配列なら、
'aa' は 2個
'bb' は 1個
'cc' は 2個
...

といったことをPerlでやりたい。じつは、ソース1はそれもかねている
%dをData::Dumperで覗いてみよう。

ソース3

use strict;
use Data::Dumper;

my @c = qw(aa bb cc dd aa cc ee ff gg ff);

my %d;
$d{$_}++ for @c;

print Dumper \%d;

結果

$VAR1 = {
          'gg' => 1,
          'cc' => 2,
          'ff' => 2,
          'bb' => 1,
          'dd' => 1,
          'aa' => 2,
          'ee' => 1
        };

○ 配列から重複しないものだけを取り出す

よい例がありましたので

リンク:
Perlの配列から、重複しないものだけを選び出したい場合、どのよ… - 人力検索はてな


○ 配列から条件にマッチしたものを取り出す

配列から条件にマッチしたものを取り出したければ grep を使えばよい。
第17回 grep - bingo_nakanishiの他言語出身者のためのPerl入門

ソース4

use strict;
use Data::Dumper;

my @c = 1..10;

# 3で割り切れるもの
my @d = grep { $_ % 3 == 0 } @c;
print "@d", "\n";

結果

3 6 9


一歩おしすすめて、

配列から条件にマッチするものが何個あるか調べる

条件にマッチするものを取り出したければ、ソース4のように grepしたものを配列に代入してやればよかった。
条件にマッチするものの個数を取得したければ、grepしたものをスカラーに代入してやればよい。
配列の大きさをスカラーコンテキストで評価すると、配列の大きさが返ることを思い出せると、すんなり理解できる。
2008-10-12

ソース5

use strict;
use Data::Dumper;

my @c = 1..10;

# 3で割り切れるもの
my $d = grep { $_ % 3 == 0 } @c;  # grepをスカラーコンテキストで評価
print "$d", "\n";

結果

3