さわだのノート

書籍のお仕事に役立つかもしれない思いつきを記録しています。

RSS: 記事の更新情報 Rss Feed

再帰呼び出しで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」とかやっているあたりが、いかにも僕らしい微妙な書き方な気がします。最初何回か書いているうちは再帰呼び出しの条件がミスってたみたいで、スクリプトが終了しなくなってしまいました。