こんな感じでしょうか。
指定回数を $limen に入れることで柔軟に繰り返し回数の条件を変更できます。
「同じ値が〇回続く」を if 文で判定するのではなく、内側のループ INNER_LOOP で現時点から1つづつカウンタを進めて1回1回判定していくようにしています。
値が同じであれば繰り返されているので、繰り返している回数を $reptation に増加していきます。
カウンタが指定回数まで達すると、条件を満たしたことを $is_recured に代入します。
外側のループ OUTER_LOOP の最後で $is_recured が真なら出力します。
出力の際はあらかじめ記録しておいた $repatation を使い、繰り返している回数分だけ出力します。
以下、例示します。
字下げに全角空白を用いてますのでコピペして試す場合は適宜削除して実行してください。
use strict;
my $data = <<'EOD';
#ヘッダー
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.03 4.1 14.8
EOD
# テキストデータを分割して各配列に入れる
my( @A, @B, @C );
foreach my $item ( split /\n/, $data ){
next if $item =~ /^#/ ;
my ($value_a, $value_b, $value_c ) = split / /, $item;
push @A, 0+$value_a;
push @B, 0+$value_b;
push @C, 0+$value_c;
}
my $limen = 5; # 条件となる繰り返し回数
my $array_length = @A; # @A の要素数
OUTER_LOOP:
for( my $idx = 0; $idx < $array_length; $idx++ ){
my $is_recured; # 繰り返し回数を満たしたかどうかを記憶する変数
my $reptation = 1; # 繰り返された回数。1回は必ず繰り返すので初期値は1
# 配列の最後まで次々と比較するループ
INNER_LOOP:
for( my $fore = 1; $idx + $fore < $array_length; $fore++ ){
# 値が同じなら繰り返し回数を増加
if( $A[ $idx ] == $A[ $idx + $fore ] ){
$reptation += 1;
}
# 値が異なればこのループを抜ける
else {
last;
}
# 条件回数に達したらフラグをセット
if( $reptation == $limen ){
$is_recured = 1;
}
}
# フラグが立っていれば、指定回数同じ値が続いているので出力
if( $is_recured ){
print "repeat same value $reptation times.\n";
for( my $i = 0; $i < $reptation; $i++ ){
print "$A[$idx+$i], $B[$idx+$i], $C[$idx+$i]\n";
}
print "----------------------\n";
}
}
__END__
実行結果
repeat same value 7 times.
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
----------------------
repeat same value 6 times.
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
----------------------
repeat same value 5 times.
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
----------------------
お礼
お礼が遅くなり申し訳ありませんでした。 内容を理解するまで少し時間をいただけないでしょうか。 丁寧にご回答をしていただき、ありがとうございました。 何とか頑張ってみます。