2

我是 perl 的绝对初学者,我试图在不同行的 2 个字符串之间提取文本行,但没有成功。看起来我在我的代码中遗漏了一些东西。代码应该打印出文件名和找到的字符串。你知道问题出在哪里吗?非常感谢您的帮助或建议。这是示例:

*****************
example:
START
new line 1
new line 2
new line 3
END
*****************

和我的脚本:

use strict;
use warnings;

my $command0 = "";
opendir (DIR, "C:/Users/input/") or die "$!";
my @files = readdir DIR;
close DIR;
splice (@files,0,2);

open(MYOUTFILE, ">>output/output.txt");
foreach my $file (@files) {
    open (CHECKBOOK, "input/$file")|| die "$!";
    while ($record = <CHECKBOOK>) {
        if (/\bstart\..\/bend\b/) {
            print MYOUTFILE "$file;$_\n";
        }
    }
    close(CHECKBOOK);
    $command0 = "";
}
close(MYOUTFILE);
4

2 回答 2

4

我想您正在尝试在这里使用触发器,这可能对您的输入很有效,但是您写错了:

if (/\bstart\..\/bend\b/) {

触发器(范围运算符)使用两个语句,由..或分隔...。你想要的是两个正则表达式加入..

if (/\bSTART\b/ .. /\bEND\b/) 

当然,你也想匹配大小写(大写),或者使用/i修饰符忽略大小写。您甚至可能希望使用行首锚点^仅匹配行首,例如:

if (/^START\b/ .. /^END\b/)

您还应该知道,您的整个程序可以用单行替换,例如

perl -ne 'print if /^START\b/ .. /^END\b/' input/*

唉,这只适用于linux。Windows 中的 cmd shell 不会 glob,因此您必须手动执行此操作:

perl -ne "BEGIN { @ARGV = map glob, @ARGV }; print if /^START\b/ .. /^END\b/" input/*

如果无论您做什么都无法打印整个文件,我认为问题出在您的输入文件上。所以花点时间研究一下,确保它是你认为的那样,例如:

perl -MData::Dumper -e"$Data::Dumper::Useqq = 1; print Dumper $_;" file.txt
于 2013-11-12T13:14:40.447 回答
0

如果要匹配多行字符串,则可能需要告诉正则表达式:

if (/\bstart\..\/bend\b/s) {

注意s正则表达式之后。

Perldoc说:

  • s

将字符串视为单行。即改“.”。匹配任何字符,甚至是换行符,通常它不会匹配。

于 2013-11-12T12:39:35.160 回答