ハンドルは、ループ内で開いたり閉じたりしない限り、最初に中断したところから「戻る」ことになります。
2番目の入力からの読み取りを停止し、最初の入力からの読み取りを実行したい場合は、内側のループから抜け出します。IN2を閉じたり再起動したりしなかったため、前に読んだレコードの後にレコードを読み取る準備ができているはずです。
RCD_FROM_1:
while( my $line= <IN1>)
{
do something;
RCD_FROM_2:
while( my $l= <IN2>)
{
do something;
last RCD_FROM_2 if some_condition();
}
}
あなたもそれを作ることができますnext RCD_FROM_1;
tell
行を再読み取りできるようにしたい場合は、すべてのループの最後にaを記録して、巻き戻してその記録を再度読み取ることができるようにすることができます。
my $prev = 0;
RCD_FROM_1:
while( my $line= <IN1>)
{
...
$prev = tell( IN2 );
RCD_FROM_2:
while( my $l= <IN2>)
{
do something;
if ( some_condition()) {
die 'Could not reset handle' unless seek( IN2, $prev, 0 );
last RCD_FROM_2;
}
$prev = tell( IN2 );
}
私自身、おそらく両方のストリームの最後のレコードをローカルにバッファリングしたいと思います。