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 で逆方向に読み取り、「前の」行が空白だったかどうかを追跡します。

段落モード ( $/ = "") で読み込み、 match /(^.*Track.*\n)(.)?/m、 $2 に基づいて別のことを行うことが定義されているかどうか。

Tie::File を使用して、ファイルを配列に関連付け、そのインデックスをループします。

于 2012-12-13T04:00:08.740 に答える
0

一般に、この行に状態を保存し、将来の状態に一致する行を見つけて、過去の状態を確認するという他の提案が好きです。

しかし、特にあなたが話しているこの種のことについては、ファイルを丸呑みして、探している2行を見つける式を使用するのが好きです。;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;

上記の部分についてはあまり満足していませんが、すべてのマッチャーを遅くすると言われているand$tailの使用を避けようとしていました。また、ファイルに「トラック」を含む行が含まれていない場合、これが機能するかどうかはわかりません。$'$&

私はこれをテストしました:

こんにちは、
私はあなたに話をするつもりです
トラックを含む行について
ただし、その後に空白行はありません
であったトラックを含む別の行

そして、その一言だけ
トラック
空行が続かない

とは対照的に
トラック

それが話です。

そして得た:

こんにちは、
私はあなたに話をするつもりです
待つ、
ただし、その後に空白行はありません
次の行は空白です

そして、その一言だけ
待つ、
空行が続かない

とは対照的に
次の行は空白です

それが話です。
于 2012-12-13T06:56:08.193 に答える