第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";
ユニークにするところをワンライナーで書くなら
さしずめこんなところだろうか
ソース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";
○ 配列に値が何個ずつ入っているか調べる
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 };
○ 配列から条件にマッチしたものを取り出す
配列から条件にマッチしたものを取り出したければ 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