我在Perl中逐行解析一个大文件(以\n结尾),但是当我到达某个关键字时,比如" TARGET ",我需要抓取TARGET和下一个完全空的行之间的所有行。
因此,给定文件的一段:
第1行
第2行
第3行
第4行目标
第5行抓取这行
第6行抓取这行
\n
它应该变成:
第4行目标
第5行抓取这行
第6行抓取这行
我遇到麻烦的原因是我已经逐行检查了文件;如何在解析过程中途更改我所分隔的内容?
发布于 2009-06-24 20:11:12
你想要这样的东西:
my @grabbed;
while (<FILE>) {
if (/TARGET/) {
push @grabbed, $_;
while (<FILE>) {
last if /^$/;
push @grabbed, $_;
}
}
}发布于 2009-06-24 20:39:34
range operator是这类任务的理想选择:
$ cat try
#! /usr/bin/perl
while (<DATA>) {
print if /\btarget\b/i .. /^\s*$/
}
__DATA__
Line 1
Line 2
Line 3
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line
Nope
Line 7 Target
Linu 8 Yep
Nope again
$ ./try
Line 4 Target
Line 5 Grab this line
Line 6 Grab this line
Line 7 Target
Linu 8 Yep发布于 2009-06-24 20:17:05
简短的答案是: perl中的行分隔符是$/,所以当您命中目标时,可以将$/设置为"\n\n",读取下一个“行”,然后将其设置回"\n"...就是这样!
现在来看更长的一个:如果使用English模块(它为Perl的所有神奇变量提供了合理的名称,那么$/就称为$RS或$INPUT_RECORD_SEPARATOR )。如果您使用IO::Handle,那么IO::Handle->input_record_separator( "\n\n")将会工作。
如果您要在更大的代码中执行此操作,请不要忘记进行本地化(在适当的作用域中使用local $/; ),或者将$/设置回其原始值"\n"。
https://stackoverflow.com/questions/1040657
复制相似问题