2

文字列内の完全なファイルを読み取ってから、次のように正規表現の一致を実行しています。

if($str =~ m/$regex/gc) {
     $offset = $+[0];
}

このコードを使用して、最後に成功した一致が終了する位置をキャプチャできます。

これで、位置が文字番号として表示されます。

行番号としてオフセットを取得する方法はありますか?

今のところ、改行文字の数を最初から$str最後まで数えています$offset

正規表現の一致の行番号を取得する直接的な方法があるかどうかを知りたいです。

4

2 に答える 2

4

想像に反して、この場合、Nahuelの使用の提案$.は実際に実行可能です。

これは、Perlを使用してファイルと同じように文字列から読み取ることができるためです。

use strict;
use warnings;

my $str = <<EOS;
spam
spam
spam
match
spam
match
EOS

open my $handle, '<', \$str or die $!;

while ( <$handle> ) {

    print $., "\n" if /match/;
}

出力

4
6
于 2012-07-10T10:51:46.123 に答える
1

perldoc perlvar、特殊変数を参照してください$.

編集:コメントの後、申し訳ありませんが私はあまりにも速く読んだ

一致するものが多い場合の別の解決策は、新しい行のオフセットを含む配列を作成することです。$ a [0]->行2のオフセットなど、行番号を概算し、最後に増減して、ライン。最後の行に改行文字が含まれていない場合、問題が発生する可能性があります。

# create an array with offset of new lines
@a=(0,0);push@a,$-[0]while$str=~/\n/gc;

if($str =~ m/$regex/gc) {
  $offset = $+[0]; 
  # get an approximation of line
  $l=int$offset*@a/$a[-1];
  # increment or decrement
  $l++while$a[$l+1]<$offset;
  $l--while$a[$l]>$offset;
}

編集:テストされていません。変更は@ a =(0,0)を初期化して、最後に+2を回避し、最初の行で一致する場合は安全です$ l ++ while $ a [$ l + 1]$offsetと*@aが追加されました

于 2012-07-10T10:25:13.207 に答える