如何使用perl正则表达式来捕获特定的文本行

时间:2012-03-20 16:25:19

标签: perl

我有以下行的文字

__Data__
test
aaaaaaaaaaaaaaaa
-dkdkdkdkdkd

__Data__
test 

aaaaaaaaaaaaaaaaa

我只想捕捉文字的一行。此代码无效。什么是正则表达式,只捕获一行文本并将其放入my-type变量

$/="__Data__";

open READFILE,"<", "one_test.txt" or die "Unable to open file";

while(<READFILE>) {
    if(/^test.*\n^([A-Za-z].*)\n(^.*)?/ms) {
        print $1,"\n";
        # my lineA = $1; not working, I can't use this variable outside the if construct (see below)
    }
    # print lineA; # does not work
}

3 个答案:

答案 0 :(得分:3)

除了您的其他错误,使用/s修饰符会使通配符.与换行符匹配。由于您使用的是贪婪的.*,它将匹配字符串末尾的所有内容,不会让您的内容捕获任何内容。

解决方法是删除/s修饰符,或者使用.*?代替非贪婪匹配。

您的其他错误:

  • 评论以#而不是//开始。
  • my lineA - &gt; lineA是一个单词,而不是一个变量。使用$lineA
  • 在封闭的块my中使用{ my $var }会将其范围限制为该块。要在块外部使用它,请将my声明放在块之外。
  • $/是您记录的结尾,因此如果您的输入具有前导__DATA__,则您将首先读取空记录。
  • 始终使用use strict; use warnings;,因为它可以防止出现简单错误并为您提供良好的调试信息。它节省了大量时间。
  • 使用适当的缩进,编写代码将不那么麻烦。我建议使用适当的编辑器来处理它,例如vim / gvim。

答案 1 :(得分:0)

来自 TLP 的好建议。在您的代码中,我不知道您为何将输入与__Data__分开。我认为有更多的信息我不知道,但有一种方法可能是逐行读取文件,正则表达式就像这样简单:

use warnings;
use strict;

open my $readfile ,"<", "one_test.txt" or die "Unable to open file";

my $lineA;

while ( <$readfile> ) { 
    chomp;
    $lineA = $1 if m/\A(a+)\Z/;
}

答案 2 :(得分:0)

我想您有充分的理由想要阅读__Data____Data__ TLP已经解释了为什么需要删除/ s修饰符 因此,不再需要将'^'放在正则表达式的中间 您还需要在变量前面加$(猜测这是一个错字) 你需要在if块之外做我的声明,否则变量是那个块的本地变量。

以下示例代码(可能)执行您要查找的内容: (假设只有一行'a'可以找到)

use strict;
use warnings;

$/="__Data__";
open READFILE,"<", "test.txt" or die "Unable to open file";
my $lineA;
while ( <READFILE> )  {
      if (/^test.*\n(a+)\n(.*)?/m) {
            $lineA = $1; 
      }
 }

 print "line with a's: $lineA\n";