我有以下行的文字
__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
}
答案 0 :(得分:3)
除了您的其他错误,使用/s
修饰符会使通配符.
与换行符匹配。由于您使用的是贪婪的.*
,它将匹配字符串末尾的所有内容,不会让您的内容捕获任何内容。
解决方法是删除/s
修饰符,或者使用.*?
代替非贪婪匹配。
您的其他错误:
#
而不是//
开始。my lineA
- &gt; lineA
是一个单词,而不是一个变量。使用$lineA
。my
中使用{ my $var }
会将其范围限制为该块。要在块外部使用它,请将my
声明放在块之外。$/
是您记录的结尾,因此如果您的输入具有前导__DATA__
,则您将首先读取空记录。use strict; use warnings;
,因为它可以防止出现简单错误并为您提供良好的调试信息。它节省了大量时间。答案 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";