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();

and the output was :

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

it is always passing the test even when my script doesn't use strict, just like this script which is located inside "." directory. the same code is available as an example at http://metacpan.org/pod/Test::File::Find::Rule

any clue ?

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::Rule提供的use strict示例是错误的。

据我了解,File::Find::Rulegrep中的方法将使用提供的每个说明符评估文件的每一行,并在第一次真正评估时停止(即,将文件保留在其结果集中)。提供了一个确保每个文件都以 shebang 行开头的示例。如果第一行未通过正则表达式,则下一个说明符(匿名子例程)将始终返回 true,并且将找到不符合要求的文件。File::Find::Rule

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

但是,对于use strict测试,您不想将自己限制在第一行。此外,该not_grep方法不需要额外的说明符:如果文件中没有任何行与正则表达式匹配,我们将保留文件。希望有帮助。

于 2009-12-24T12:15:43.600 回答