1
use warnings;
use Test::More;
use File::Find::Rule;
use Test::File::Find::Rule;

my $rule = File::Find::Rule->file->name('*.pl')->not_grep(qr/^\s*use\s+strict;/m, sub { 1 });
match_rule_no_result($rule, ".", 'use strict usage');
done_testing();

そして出力は:

out put :
ok 1 - use strict usage
1..1

「。」内にあるこのスクリプトのように、スクリプトがstrictを使用していない場合でも、常にテストに合格しています。ディレクトリ。同じコードが例としてhttp://metacpan.org/pod/Test::File:: Find::Ruleで入手できます。

どんな手掛かり ?

F。

4

2 に答える 2

10

代わりにPerl::Criticを使用することを検討してください。これにより、これをより確実に実行でき、構成可能であり、さらに多くのことを実行できます。それを強制するためのTest::Perl::Criticもあります。

Perl :: Criticには、狭窄をオンにするMooseのようなものを認識するという利点もあります。

于 2009-12-24T12:53:25.023 に答える
3

確認するには、次のuse strictようにします。

my $rule = File::Find::Rule
    ->file->name('*.pl')
    ->not_grep( qr/^\s*use\s+strict;/ )
;

アップデート

Schwernとjrockwayに同意します。強制するためのより良いモジュールがありますuse strict

そうは言っても、これがあなたの質問の詳細について私が理解できたものです。

Test :: File :: Find::Ruleuse strictによって提供される例は誤った方向に進んでいます。

私が理解しているように、File :: Find :: Rulegrepのメソッドは、提供された各指定子を使用してファイルの各行を評価し、最初の真の評価で停止します(つまり、ファイルを結果セットに保持します)。すべてのファイルがシバン行で始まることを確認する例を提供します。最初の行が正規表現に失敗した場合、次の指定子(匿名サブルーチン)は常にtrueを返し、不適合ファイルが見つかります。File::Find::Rule

$rule->grep( qr/^#!.*\bperl/, [ sub { 1 } ] );

ただし、use strictテストの場合は、最初の行に制限する必要はありません。また、このnot_grepメソッドでは追加の指定子が不要になります。ファイル内のどの行も正規表現に一致しない場合は、ファイルを保持します。お役に立てば幸いです。

于 2009-12-24T12:15:43.600 に答える