再帰呼び出しでN回連続した行を抽出する
行単位で文字列を比較し、N回連続した行を抽出するPerlのスクリプトを書いてみました。
練習がてら、あまり得意ではない再帰呼び出しを使っています。
#!/usr/bin/env perl use 5.12.3; use warnings; use utf8; use open IO => qw/:utf8 :std/; use Attribute::Constant; my @list = <DATA>; # 比較する行が入ったリスト my @kaburi = (); # N回連続した行が入るリスト my $N : Constant(5); # ここの数値で連続回数を指定 my $count = 0; # カウンタ変数 sub yobidasi { my $num = shift @_; $count++; yobidasi(shift @list) if defined $list[0] && $num eq $list[0]; push @kaburi, $num if $count > $N; $count = 0; } while (my $num = shift @list) { yobidasi($num); } say @kaburi; __DATA__ 0.00 2.0 11.5 0.01 6.3 17.2 0.01 2.1 14.2 0.01 1.2 14.3 0.01 2.1 14.3 0.01 3.7 14.3 0.01 3.7 14.3 0.01 4.1 14.3 0.06 4.1 14.3 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.01 4.1 14.9 0.03 4.1 14.8
結果はこんな感じになるはず。
0.01 4.1 14.9
再帰呼び出しで「shift @list」とかやっているあたりが、いかにも僕らしい微妙な書き方な気がします。最初何回か書いているうちは再帰呼び出しの条件がミスってたみたいで、スクリプトが終了しなくなってしまいました。