Perlの配列やハッシュで便利そうな処理をgrepを中心にいろいろ調べてみました。
grepとは?
Linuxの検索で使うコマンドだと思いますが、Perl本体の中でも使います。
Linuxコマンドと同じで
条件に該当した配列 = grep 条件式 配列
となります。
grepを使った配列処理 基本
以下にgrepを使った便利な処理を書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
use strict; use warnings; use Data::Dumper; use List::Util 'max'; my @arr=(2,4,5,7,8); print grep{ $_% 2 == 0 }@arr; #248 print "\n"; #下記と同じ for my $v(@arr){ if( $v %2 == 0 ){ print $v; } } print "\n"; |
一番単純なパターンです。grep{}のなかに条件式を書きます。$_というのが中で展開される変数のようですね。
次にもう少し実用的な処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# phpでいうin_array @arr = ("hoge","foo","bar"); my $var = 'hoge'; if( grep {$_ eq $var} @arr){ print "in_array"; } #in_arrayと出力 print "\n"; $var="hogehoge"; if( grep {$_ eq $var} @arr){ print "in_array"; } #何も表示されない #array_unique my %count; @arr =("hoge","foo","bar","hoge"); @arr = grep{ !$count{$_}++ }@arr; print Dumper \@arr; #$VAR1 = [ # 'hoge', # 'foo', # 'bar' # ]; |
Home Subscribe Perlで、ある要素が配列(リスト)の中に存在するかを調べる方法
grepを使った配列処理 ハッシュを含む多次元配列への応用
実務でもっともよく出てくる多次元配列への応用処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#実務で一番使うハッシュ型の配列への応用 my $hash_arr =[ {"name"=>"kazumi","age"=>"30","pref"=>"chiba"}, {"name"=>"ichirou","age"=>"18","pref"=>"tokyo"}, {"name"=>"yuusuke","age"=>"25","pref"=>"chiba"}, {"name"=>"satoshi","age"=>"45","pref"=>"kanagawa"}, {"name"=>"jirou","age"=>"9","pref"=>"tokyo"} ]; #応用系その1 #30才以上のデータを取り出す #下記で一気に取り出せる my @arr2 = grep{ $_->{"age"} >= 30 } @$hash_arr; print Dumper @arr2; #$VAR1 = { # 'pref' => 'chiba', # 'name' => 'ichiro', # 'age' => 30 # }; #$VAR2 = { # 'pref' => 'kanagawa', # 'name' => 'shirou', # 'age' => 45 # }; print "\n"; #応用系 その2 #名前にrouが入っている人間を抽出し合計を出す my @arr3 = grep{ $_->{"name"} =~ /rou/ } @$hash_arr; my $sum; $sum += $_->{"age"} for @arr3; print "sum" . $sum; #27 ichirouとjirouの合計値 print "\n"; #応用系3 県ごとにクルーピング my @pref_arr=(); #県情報だけを全て取得 push @pref_arr , $_->{"pref"} for @$hash_arr; #重複を取り除く my %count2; my @pref_arr2 = grep{ !$count2{$_}++ }@pref_arr; #それぞれをキーにしたハッシュを作る my $pref_hash; for my $pref_val (@pref_arr2){ $pref_hash->{$pref_val} =undef; } #県がhashになっているものを格納していく for my $person_hash (@$hash_arr){ my $pref_key = $person_hash->{"pref"}; my @tmp_data_arr=(); #hashデータが存在しない時はそのまま入れる if( !$pref_hash->{$pref_key}){ push (@tmp_data_arr ,$person_hash); }else{ #データがすでに存在しているときは一旦一時的な配列にデータを入れて #再度入れなおす my $tmp_data_arr_ref = $pref_hash->{$pref_key}; @tmp_data_arr = @$tmp_data_arr_ref; push( @tmp_data_arr ,$person_hash); } $pref_hash->{$pref_key} = \@tmp_data_arr; } print Dumper $pref_hash; #$VAR1 = { # 'tokyo' => [ # { # 'pref' => 'tokyo', # 'name' => 'ichirou', # 'age' => 18 # }, # { # 'pref' => 'tokyo', # 'name' => 'jirou', # 'age' => 9 # } # ], # 'kanagawa' => [ # { # 'pref' => 'kanagawa', # 'name' => 'satoshi', # 'age' => 45 # } # ], # 'chiba' => [ # { # 'pref' => 'chiba', # 'name' => 'kazumi', # 'age' => 30 # }, # { # 'pref' => 'chiba', # 'name' => 'yuusuke', # 'age' => 25 # } # ] # }; |
Perlゼミ grep関数 – 特定の条件を満たす配列要素のみ取得
またPerlに標準で入っているListというライブラリを使うと最大値や最小値を比較的簡単に求められます。
1 2 3 4 5 6 7 |
#max @arr=(20,50,30); my $max_val = max @arr; print "max". $max_val; #50 #他にmin(最小値),sum 合計値などもあり |
開発にとりかかる前にしってればよかった・・・
Perlの情報は↓が一番っぽいですね。
次はmapやります。