0

別のファイルを入力として受け取り、すべてのuseステートメントを出力するperlモジュールを作成しようとしています(strictとwarningsを除く)

my @result = grep /use\s+([^;(strict|warnings)]+)/, @file;

これは印刷します:

use Package1;
use Package2;

ただし、「Package1」の部分だけが必要です。したがって、マップを使用する場合:

my @result = map /use\s+([^;(strict|warnings)]+)/, @file;

これは間違った値を返します(最初の2文字または3文字を返します)

my @result = map /use\s+([^;]+)/, @file;

Package1、Package2、strict、warningsを返します。

最初のマップステートメントの正規表現を修正する方法を教えてもらえますか?

ありがとう

4

2 に答える 2

3

これを行うためのモジュールがあります。 Perl::PrereqScannerDist::Zillaが使用するものであり、私はそれがかなりうまく機能することを発見しました。

そして、Neil Bowersは、利用可能なソリューションの素晴らしいレビューをしています。コメントでそれを指摘してくれた@JoelBergerに感謝します。

汎用のPerlコードスキャンには、Perlの文法を理解しているPPIを使用するのが最適です。Perl::PrereqScannerやPerl::Criticのようなものがそれを使用します。

于 2013-03-26T05:58:24.680 に答える
2

grepフィルタにスローインします。

my @result = grep { !/^(?:strict|warnings)$/ } map /use\s+([^;]+)/, @file;
于 2013-03-26T03:00:06.583 に答える