您似乎想要打印符合三个类别之一的行。
__Data__标记
- SCSI 测试线
- 空行
Perl 的段落模式在工作时很方便,但它很脆弱。段落完全由 sequence终止"\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
在实际使用中,您将删除标记为仅用于演示的行,然后在命令行上提供一个或多个数据文件。这个看起来很有趣的if eof && !eof()测试试图确定何时在记录之间插入额外的分隔符。如果您希望它完全正确,则需要更加深思熟虑。
下面是多个文件的输入示例。
$猫输入1
__数据__
SCSI - 测试-A
cccccccccccccccc
啊啊啊啊啊啊啊
bbbbbbbbbbbbbbbbb
__数据__
SCSI - 测试-B
cccccccccccccccc
啊啊啊啊啊啊啊
bbbbbbbbbbbbbbbbb
$猫输入2
__数据__
SCSI - 测试-C
cccccccccccccccc
啊啊啊啊啊啊啊
bbbbbbbbbbbbbbbbb
$ ./extract-tests 输入1 输入2
__数据__
SCSI - 测试-A
__数据__
SCSI - 测试-B
__数据__
SCSI - 测试-C