我已经开始将一个项目转换为Moose,我注意到的第一件事就是我的批评/整洁测试下地狱了.Moose,Tidy和Critic似乎并不像以前那样喜欢对方.
是否有关于如何使批评/整理更加欣赏穆斯方言的文档?大多数Moose用户做什么?放松/放弃批评更重的Moose模块?自定义政策?
perlcritic投诉,以下代码,一些样板DBI的东西完全正常,应该croak代替die:
# Connect to database
my $db_handle = DBI->connect( $url, $user, $password ) or die $DBI::errstr;
Run Code Online (Sandbox Code Playgroud)
所有这些,虽然死对我来说似乎很好.
我会想到一个武士Perl战士,当事情出错时,呱呱声不如实际死亡.开玩笑
我为什么要croak代替die?
不听取perlcritic建议的后果是什么?
最近,我决定在我的代码上更频繁地使用Perl :: Critic.在Perl编程近7年后,我已经习惯了大部分Perl最佳实践,但我知道总有改进的余地.有一件事让我烦恼的是,Perl :: Critic并不喜欢我为子程序解包@_的方式.举个例子:
sub my_way_to_unpack {
my $variable1 = shift @_;
my $variable2 = shift @_;
my $result = $variable1 + $variable2;
return $result;
}
Run Code Online (Sandbox Code Playgroud)
这就是我一直以来的做法,而且,正如PerlMonks和Stack Overflow所讨论的那样,它也不一定是邪恶的.
将上面的代码段更改为...
sub perl_critics_way_to_unpack {
my ($variable1, $variable2) = @_;
my $result = $variable1 + $variable2;
return $result;
}
Run Code Online (Sandbox Code Playgroud)
...也有效,但我发现它更难阅读.我也读过Damian Conway的书Perl Best Practices,我真的不明白我的首选解包方法是否属于他的建议,以避免@_直接使用,正如Perl :: Critic所暗示的那样.我一直认为康威在讨论如下的肮脏:
sub not_unpacking {
my $result = $_[0] + $_[1];
return $result;
}
Run Code Online (Sandbox Code Playgroud)
上面的例子很糟糕,很难阅读,我永远不会考虑在一段生产代码中编写它.
简而言之,为什么Perl …
我们一直在使用Perl::Critic这里来执行我们的代码约定.最近/tmp,由于该Temp::File::tempdir功能,我们遇到了填满目录的问题.tempdir当Perl进程终止时清理,但由于我们的整个后端是Perl进程,这只发生在服务器本身重新启动时(不经常).我们希望鼓励开发人员newdir在将来使用对象方法,一旦对象超出范围,它就会自行清理.
基本上,我们试图将其标记Temp::File::tempdir为违反代码约定,但我似乎无法找到任何类似于CPAN的规则.我知道这很难用动态类型的语言强制执行而不会引入误报,但我希望有人在过去遇到类似的问题而另一个已弃用的函数.我们也不期望抓住所有棘手的案例,只是最明显的用途Temp::File::tempdir.我们的想法是阻止意外使用tempdir何时newdir可以完成工作,而不是抓住所有欺骗批评者的尝试(开发人员总是可以使用## no critic).tempdir如果use Temp::File定义了(最好检查没有别的东西重新定义tempdir)和何时Temp::File::tempdir使用,它可能就足够了.
是否有类似的东西,或者我应该从头开始?谢谢
有一个简单的模块
package Rrr;
use 5.014;
use warnings;
use namespace::sweep;
use Moo;
use Method::Signatures::Simple;
BEGIN {
our $VERSION = '0.0.1';
}
has 'root' => (
is => 'rw',
default => 'root'
);
method func {
say 'This is the func method from ' . __PACKAGE__ . ' with value: ', $self->root;
}
1;
Run Code Online (Sandbox Code Playgroud)
该perlcritic -1说
Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity: 1)
Module does not end with "1;" at line …Run Code Online (Sandbox Code Playgroud) 我所知道的是Perl :: Critic
到目前为止,我的谷歌搜索没有导致多次尝试的结果.:-(
有没有人在这里有任何建议?
任何根据我们的编码标准配置Perl :: Critic并在代码库上运行它的资源将不胜感激.
PPI和Perl :: Critic允许程序员在他们的Perl程序的语法中检测某些东西.
有什么类似的东西可以标记/解析C并让你有机会编写一个脚本来处理这些信息吗?
我在我的一个脚本上运行了Perl :: Critic,并收到了以下消息:
Regular expression without "/x" flag at line 21, column 26. See page 236 of PBP.
Run Code Online (Sandbox Code Playgroud)
我在这里查看了策略信息,并且我理解在扩展模式下编写正则表达式将有助于任何正在查看代码的人.
但是,我被困在如何转换我的代码以使用/ x标志.
CPAN示例:
# Match a single-quoted string efficiently...
m{'[^\\']*(?:\\.[^\\']*)*'}; #Huh?
# Same thing with extended format...
m{
' # an opening single quote
[^\\'] # any non-special chars (i.e. not backslash or single quote)
(?: # then all of...
\\ . # any explicitly backslashed char
[^\\']* # followed by an non-special chars
)* # ...repeated zero or …Run Code Online (Sandbox Code Playgroud) 我是Perl的新手,目前我的任务是整理和维护一个庞大且相当混乱的Perl项目.我正在使用perl-critic来帮助我检测代码中的问题(并教我最佳实践).
现有代码具有编码器创建无法访问代码的位置.例如,他们添加了'&& 0'作为评论一些代码分支的懒惰方式:
if ($req->param('donut') && 0) {
unreachable code...
} else {
always branches to here...
}
Run Code Online (Sandbox Code Playgroud)
我希望perl或者Critic会在这种情况下警告我无法访问的代码(条件有一个常量值评估为false),但事实并非如此.
是否有可以使用的工具或脚本可以可靠地检测到这种事情?
显然我可以在源代码中搜索"&& 0",但除了将"&& 0"附加到if语句之外,编码器还有许多方法可以创建无法访问的代码.
Critic不接受关注代码,严重性为4:
return {
'debug' => $debug,
'identifier' => $identifier
};
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
# Perl::Critic found these violations in "filename.pl":
# Comma used to separate statements at line 356, column 3. See pages 68,71 of PBP. (Severity: 4)
Run Code Online (Sandbox Code Playgroud)
但是这个代码没有任何评论被接受:
my $result = {
'debug' => $debug,
'identifier' => $identifier
};
return $result;
Run Code Online (Sandbox Code Playgroud)
使用临时变量编写返回信息真的更好吗,或者在检测到Comma used to separate statements我刚刚构建并返回hashref时批评错误?
perl ×10
perl-critic ×10
coding-style ×2
c ×1
frameworks ×1
moose ×1
parsing ×1
perl-tidy ×1
regex ×1
tokenize ×1