我有一个文本文件。
open FILE,"<data.txt";
while(<FILE>) {
print $_;
if($_ =~ m/Track/) {
# do something ......
#if next line is blank do something else....
}
}
但是如何发现呢?任何想法?
我有一个文本文件。
open FILE,"<data.txt";
while(<FILE>) {
print $_;
if($_ =~ m/Track/) {
# do something ......
#if next line is blank do something else....
}
}
但是如何发现呢?任何想法?
您还没有阅读下一行,因此您无法检查它是否为空白。相反,一旦遇到空行,您必须使用缓冲区来处理较早的行。
my $last;
while (<>) {
s/\s+\z//;
if ($.>1 && !length) {
...do something with $last...
}
$last = $_;
}
如果您还没有阅读下一行,您将无法根据下一行的内容做出任何决定。但是您可以执行以下操作:
open FILE,"<data.txt";
my $current = <FILE>;
my $next;
while(<FILE>) {
$next = $_;
print $current;
if ($next) {
# do something ......
} else {
#if next line is blank do something else...
}
$current = $next;
}
当您到达文件末尾并且没有下一行要读取时,您还必须准确地决定要做什么。
其他一些想法,取决于您在做什么:
使用 File::ReadBackwards 向后读取并跟踪“上一个”行是否为空白。
阅读段落模式 ( $/ = ""
) 并匹配/(^.*Track.*\n)(.)?/m
,是否定义了基于 $2 的不同操作。
使用 Tie::File 将文件绑定到一个数组并遍历其索引。
一般来说,我喜欢其他建议,将您的状态保存在此行,找到与您的未来条件匹配的行并检查过去的条件。
然而,特别是对于您正在谈论的这种事情,我喜欢在文件中啜饮并使用找到您正在寻找的两行的表达式。如果您最终只是想使用s///mg
而不是使用m//
;会容易得多
open FILE,"<data.txt";
my $text = do { local( $/ ) ; <FILE> } ;
close FILE;
# the slurping I mentioned is now done.
my $tail = "";
while($text =~ m/\G((?:.|\n)*?)^.*Tracks.*$/mg) {
print $1;
if($text =~ m/\G.^$/ms) {
print "the next line is blank";
} else {
print "wait,";
}
$text =~ m/(\G.*)/ms;
$tail = $1;
}
print $tail;
我对$tail
上面的部分不太满意,但我试图避免使用$'
and$&
据说会减慢所有匹配器的速度。如果文件不包含任何包含“Tracks”的行,我也不确定这是否有效。
我对此进行了测试:
你好, 我要给你讲一个故事 关于包含 Tracks 的行 虽然后面没有空行 另一行包含 Tracks 是 然后只有一个字 曲目 后面没有空行 相对于 曲目 这就是故事。
并得到:
你好, 我要给你讲一个故事 等待, 虽然后面没有空行 下一行是空白 然后只有一个字 等待, 后面没有空行 相对于 下一行是空白 这就是故事。