5

一連のファイルパスがあり、を含まないすべてのファイルパスを一覧表示したいと思いますx/y/z/。もう1つの制約はprint if !m{x/y/z/}、スクリプトに対する書き込み権限がないため、使用できないことです。スクリプトに正規表現パターンを(コマンドラインオプションとして)含めることができます。つまり、一致するものがすべて出力されます。

これが私の試みです。前にないすべての行を一致させようとしていx/y/z/ます。

#!/usr/bin/perl
use warnings;
use strict;

while(<DATA>) {
   print if m{(?<!x/y/z/).*};
}

__DATA__
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/a/b/m.cc
x/y/a/b/m.cc

私の期待は、下の2つの文字列だけを印刷することですが、すべてを印刷します。しかし、パターンをに変更すると(?<=x/y/z/).*、上位3つの文字列のみが出力されます。

x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc

なぜそうなのか、そして正規表現を修正するにはどうすればよいですか?

4

1 に答える 1

4

必要なのはネガティブな先読みです。だから、修道院から直接答えが来ます:

#!/usr/bin/perl
use warnings;
use strict;

while(<DATA>) {
   print if m{^(?!(?s:.*)x/y/z)}; 
}

__DATA__
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/z/a/b/x.cc
x/y/a/b/m.cc
x/y/a/b/m.cc
于 2012-11-09T05:44:20.370 に答える