1

我有一个文本文件。

open FILE,"<data.txt";
while(<FILE>) {
  print $_;
  if($_ =~ m/Track/) {
    # do something ......
    #if next line is blank do something else....
  }
}

但是如何发现呢?任何想法?

4

4 回答 4

4

您还没有阅读下一行,因此您无法检查它是否为空白。相反,一旦遇到空行,您必须使用缓冲区来处理较早的行。

my $last;
while (<>) {
   s/\s+\z//;
   if ($.>1 && !length) {
      ...do something with $last...
   }

   $last = $_;
}
于 2012-12-13T03:18:44.900 回答
2

如果您还没有阅读下一行,您将无法根据下一行的内容做出任何决定。但是您可以执行以下操作:

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;
}

当您到达文件末尾并且没有下一行要读取时,您还必须准确地决定要做什么。

于 2012-12-13T03:17:08.367 回答
1

其他一些想法,取决于您在做什么:

使用 File::ReadBackwards 向后读取并跟踪“上一个”行是否为空白。

阅读段落模式 ( $/ = "") 并匹配/(^.*Track.*\n)(.)?/m,是否定义了基于 $2 的不同操作。

使用 Tie::File 将文件绑定到一个数组并遍历其索引。

于 2012-12-13T04:00:08.740 回答
0

一般来说,我喜欢其他建议,将您的状态保存在此行,找到与您的未来条件匹配的行并检查过去的条件。

然而,特别是对于您正在谈论的这种事情,我喜欢在文件中啜饮并使用找到您正在寻找的两行的表达式。如果您最终只是想使用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 是

然后只有一个字
曲目
后面没有空行

相对于
曲目

这就是故事。

并得到:

你好,
我要给你讲一个故事
等待,
虽然后面没有空行
下一行是空白

然后只有一个字
等待,
后面没有空行

相对于
下一行是空白

这就是故事。
于 2012-12-13T06:56:08.193 回答