我试图在单个Perl脚本中排除对Perl Critic的RequireRcsKeywords的检查.我不想在.perlcriticrc中更改我的默认策略,所以我在源代码的顶部添加了一个"no critic"行.尽管有这样的改变,Perl Critic仍然抱怨缺乏RCS关键词.
这是我的测试用例(critictest.pl):
#!/usr/bin/perl
## no critic (RequireRcsKeywords)
use warnings;
use strict;
print "Hello, World.\n";
Run Code Online (Sandbox Code Playgroud)
当我执行时,perlcritic -1 --verbose 8 critictest.pl我得到以下输出:
[Miscellanea::RequireRcsKeywords] RCS keywords $Id$ not found at line 1, column 1. (Severity: 2)
[Miscellanea::RequireRcsKeywords] RCS keywords $Revision$, $HeadURL$, $Date$ not found at line 1, column 1. (Severity: 2)
[Miscellanea::RequireRcsKeywords] RCS keywords $Revision$, $Source$, $Date$ not found at line 1, column 1. (Severity: 2)
[Modules::RequireVersionVar] No package-scoped "$VERSION" variable found at line 1, column 1. (Severity: 2) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Komodo中启用PerlCritic支持.
来自ActiveState的官方消息,Komodo IDE 5.1(Win 32)的制造商是:
"要启用PerlCritic支持,请安装'Perl-Critic'和'批评'模块."
好吧,安装Perl-Critic是件小事:
ppm install Bundle-Perl-Critic
Run Code Online (Sandbox Code Playgroud)
但是,我搜索了PPM4中的每个存储库(麻烦和常见的嫌疑人),他们似乎没有名为"批评"的模块.我已经使用CPAN和PPM安装了许多模块,但到目前为止,这个模块被证明是最难以捉摸的.我在这里错过了什么吗?
有没有人有幸在Windows上的Komodo 5.1中支持PerlCritic?期待您的回复.该功能在MacOS和Linux中完美运行,但是......嗯.

我知道最好使用Modern :: Perl而不是使用严格和警告.
使用默认选项,Perl :: Critic v1.121会在严格之前抱怨代码,即使在代码之前使用"使用Modern :: Perl"也是如此.
问题:如下所示更新perlcriticrc配置的最佳解决方案,还是有更好的方法?
cat~/.perlcriticrc
[TestingAndDebugging::RequireUseStrict]
equivalent_modules = Modern::Perl
[TestingAndDebugging::RequireUseWarnings]
equivalent_modules = Modern::Perl
Run Code Online (Sandbox Code Playgroud)
另外值得注意: 开发者讨论在这里
我的部门目前正在解决一些通用代码的最佳实践,这是我们想有所加强,为开发人员提供Perl::Tidy和Perl::Critic配置.
现在我们遇到了附带评论的问题.附注是这样的:
my $counter = 0; # Reset counter
Run Code Online (Sandbox Code Playgroud)
我们宁愿根本没有侧面评论,因为在大多数情况下,它们可以写在有问题的代码之上,在那里它们更容易阅读.如果可能的话,一个Perl::Tidy解决方案将是完美的,这会将一个侧面评论移到它上面的一行,第二个最好的将是一个Perl::Critic政策(我在CPAN没有找到)和第三个最好的,最后一个将是开发人员在进行代码审查时要注意将这些意见指出.
是否可以用Perl::Tidy或实施Perl::Critic?
我有一个脚本,我试图使用perlcritic来贬低不良做法.
我有一行如下:
open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system.");
Run Code Online (Sandbox Code Playgroud)
这给出了这个错误:在xxx行x列使用了两个参数"open".参见PBP第207页.(严重程度:5)
关于如何修复它的任何想法?
我想在子进程中压缩输出并只读取stderr.perlfaq8建议做以下事项:
# To capture a program's STDERR, but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open(NULL, ">", File::Spec->devnull);
my $pid = open3(gensym, ">&NULL", \*PH, "cmd");
while( <PH> ) { }
waitpid($pid, 0);
Run Code Online (Sandbox Code Playgroud)
但后来perlcritic争论使用裸字文件句柄.
我唯一可以设计的是将select新打开的描述符/dev/null改为on STDOUT,如下所示:
# To capture a program's STDERR, but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open my $null, ">", File::Spec->devnull;
my $old_stdout = select( $null );
my $pid = …Run Code Online (Sandbox Code Playgroud) 我在perl中使用正则表达式将字符串转换为十六进制,但是,当我这样做时,我会收到来自perl评论家或perl的警告:
#$test is defined, i just put the regex code snippet here...
#this will trigger a warning from perl critic
#warning: use of regex expression without "/x" expression..
$text =~ s/(.)/sprintf("%x",ord($1))/eg;
#this will trigger a a warning at run time
#warning: "uninitialized value $1 in regexp compilation"
$text =~ m{s/(.)/sprintf("%x",ord($1))/eg}x;
Run Code Online (Sandbox Code Playgroud)
有没有办法编写上面的代码,没有得到Perl评论家的警告或反馈?
我认为问题是因为ord正在处理未定义的值,当你输入/ x时,检查regex表达式认为$ 1的值是无效的.
在挖掘一些旧的源代码时,我看到了以下内容:
my $module = $some{module};
eval "require $module";
die "Bad module\n$@" if $@;
Run Code Online (Sandbox Code Playgroud)
当我理解代码的作用时,它会尝试"需要"一个模块并在它不成功时死掉 - perlcritic抱怨它
第31栏第13栏"eval"的表达形式.参见PBP第161页.(严重程度:5)
不幸的是我没有PBP书,所以想知道上面的正确方法是什么...
此外,在相同的来源发现:
sub test_repo_file {
my($self, $repo, $test) = @_;
my $abspath = repo_abs_path($repo);
return "eval -$test $abspath";
}
Run Code Online (Sandbox Code Playgroud)
这里不明白什么解决了"eval",并且perlcritic再次抱怨"字符串评估"......
有人可以解释关于"字符串评估"的基本要点以及如何正确编写上述内容吗?
我正在尝试开始使用Perlcritic,我正在努力改进我自己的配置,省略了我不同意或不认为适合我的所有规则.
我知道我可以使用.perlcrirticrc文件执行此操作,并且我可以使用该文件中的exclude指令来排除我不同意的策略,但为此,我需要找到策略的名称导致我想要抑制的错误.
我无法在任何地方的CPAN文档中找到策略列表,并且错误消息没有给出生成的策略的名称,所以我完全不知道我应该如何生成我的策略排除清单.
如果有人能指出我将错误映射到策略的方法,或者甚至只是将我指向核心中的策略列表,我将非常感激!
我有:
$rejected->{join ',', @needed}++ unless @filtered;
Run Code Online (Sandbox Code Playgroud)
但perlcritic抱怨
title=带引号的哈希键 - 严重性 5::[HashKeyQuotes] 避免无用的引号
显然我可以降低严重程度,但我想知道是否还有其他方法?
我能想到的两个是:
join之外{}。还有其他方法吗?