3 つのカテゴリのいずれかに当てはまる行を印刷したいと考えているようです。
__Data__
マーカー
- SCSI テスト ライン
- 空行
Perl の段落モードは、機能すれば便利ですが、脆弱です。段落はシーケンスによって正確"\n\n"
に終了しますが、空白を表示しないエディターでは、段落の後に空白ではあるが空ではない行がある場合、これをデバッグするのが難しくなる可能性があります。
あなたの質問に書かれているように、以下のコードはあなたが望む出力を生成します。
#! /usr/bin/env perl
use strict;
use warnings;
use 5.10.0; # smart matching
*ARGV = *DATA; # for demo only
my @interesting_line = (qr/^__Data__/, qr/SCSI - test-/, qr/^\s*$/);
while (<>) {
print if $_ ~~ @interesting_line;
print "\n" if eof && !eof();
}
__DATA__
__Data__
SCSI - test-A
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
__Data__
SCSI - test-B
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
__Data__
SCSI - test-C
ccccccccccccccccc
aaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbb
実際の使用では、デモ専用とマークされた行を削除してから、コマンド ラインで 1 つまたは複数のデータ ファイルを指定します。おかしな見た目のif eof && !eof()
テストは、レコード間に追加のセパレーターをいつ挿入するかを決定しようとします。正確に正しくしたい場合は、より慎重に行う必要があります。
複数のファイルに対する入力の例を以下に示します。
$猫入力1
__データ__
SCSI - テスト A
cccccccccccccccccc
あああああああああああああ
bbbbbbbbbbbbbbbb
__データ__
SCSI - テスト B
cccccccccccccccccc
あああああああああああああ
bbbbbbbbbbbbbbbb
$猫入力2
__データ__
SCSI - テスト-C
cccccccccccccccccc
あああああああああああああ
bbbbbbbbbbbbbbbb
$ ./extract-tests 入力1 入力2
__データ__
SCSI - テスト A
__データ__
SCSI - テスト B
__データ__
SCSI - テスト-C