Test :: File :: Find :: Rule检查我们所有的perl脚本是否都使用严格

时间:2009-12-24 11:36:24

标签: perl testing cpan

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。

2 个答案:

答案 0 :(得分:10)

请考虑使用Perl::Critic,这可以更可靠地执行此操作,可配置,并且可以执行更多操作。甚至有Test::Perl::Critic来执行它。

Perl :: Critic还具有了解Moose之类的能够打开限制的优势。

答案 1 :(得分: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::Rule中的grep方法将使用提供的每个说明符评估文件的每一行,在第一个时停止(即保留文件在其结果集中)评价。 File::Find::Rule提供了一个示例,确保每个文件开始与shebang行。如果第一行未通过正则表达式,则下一个说明符(匿名子例程)将始终返回true,并且将找到不符合要求的文件。

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

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