以下perl代码在PerlCritic中生成警告(由Activestate生成):
sub natural_sort {
my @sorted;
@sorted = grep {s/(^|\D)0+(\d)/$1$2/g,1} sort grep {s/(\d+)/sprintf"%06.6d",$1/ge,1} @_;
}
Run Code Online (Sandbox Code Playgroud)
生成的警告是:
不要在列表函数中修改$ _
我不明白警告,因为我不认为我正在修改$ _,虽然我想我一定是.有人可以向我解释一下吗?
我被告知有可能Perl::Critic在其输出中显示违规的策略名称.但我不记得我要做些什么来打开它.怎么能在一个perlcritic.rc?
我需要为 Perl 中的静态代码分析实现 lint 和 Perl::Critic。我在 Perl 中找到了用于 lint 的 B::Lint 模块。
我尝试下载,解压缩,按照说明操作:
tar -zxf Perl-Critic-1.107_001.tar.gz
cd Perl-Critic-1.107_001
perl Makefile.PL
make
make test
make install
Run Code Online (Sandbox Code Playgroud)
当我进入制作步骤时,我得到:
/usr/bin/perl "-Iblib/arch" "-Iblib/lib" t/Variables/RequireLocalizedPunctuationVars.run.PL t/Variables/RequireLocalizedPunctuationVars.run
Can't locate B/Keywords.pm in @INC (@INC contains: blib/arch blib/lib /Library/Perl/5.12/darwin-thread-multi-2level /Library/Perl/5.12 /Network/Library/Perl/5.12/darwin-thread-multi-2level /Network/Library/Perl/5.12 /Library/Perl/Updates/5.12.3 /System/Library/Perl/5.12/darwin-thread-multi-2level /System/Library/Perl/5.12 /System/Library/Perl/Extras/5.12/darwin-thread-multi-2level /System/Library/Perl/Extras/5.12 .) at t/Variables/RequireLocalizedPunctuationVars.run.PL line 16.
BEGIN failed--compilation aborted at t/Variables/RequireLocalizedPunctuationVars.run.PL line 16.
make: *** [t/Variables/RequireLocalizedPunctuationVars.run] Error 2
Run Code Online (Sandbox Code Playgroud)
我怀疑它是因为我错过了依赖.我也发现了这个任务 - https://metacpan.org/pod/Task::Perl::Critic这看起来很有趣,但它没有关于如何运行的指示.
---编辑运行后 - sudo cpan Task :: Perl :: Critic
我得到这些结果:
Test Summary Report
-------------------
t/20_policies.t (Wstat: 512 Tests: 0 Failed: 0)
Non-zero …Run Code Online (Sandbox Code Playgroud) 我正在阅读perlcritic文档以避免反引号并在此处使用IPC :: Open3:
http://perl-critic.stacka.to/pod/Perl/Critic/Policy/InputOutput/ProhibitBacktickOperators.html
我试图找到最简单的选项,它将起作用并满足perlcritic:
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3 'open3'; $SIG{CHLD} = 'IGNORE';
my $cmd = 'ls';
my ($w,$r,$e); open3($w,$r,$e,$cmd);
my @o = <$r>; my @e = <$e>;
1;
Run Code Online (Sandbox Code Playgroud)
但它抱怨以下错误:
Use of uninitialized value in <HANDLE> at ipc_open3.pl line 7
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:好的,这就是我所拥有的.除非有办法简化它,否则我会坚持这样:
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open3 'open3'; $SIG{CHLD} = 'IGNORE';
use Symbol 'gensym';
my $cmd = 'ls';
my ($w,$r,$e) = (undef,undef,gensym); my $p = open3($w,$r,$e,$cmd);
my @o = <$r>; my @e = <$e>;
1;
Run Code Online (Sandbox Code Playgroud) 所以我最近开始使用Perl::Critic来检查我编写的代码的质量。我正在以残酷的模式运行它,并有一个建议,我不明白这是一个问题。输出是:
Return value of flagged function ignored - print at line 197, column 13. See pages 208,278 of PBP. (Severity: 1)
这基本上是对打印功能的调用,并带有一条输出到控制台的短消息。那么为什么我要捕获几乎肯定总是 1 的返回值,因为我想不出任何这不会是 1 的用例。
野蛮模式是不是“太野蛮”了?或者我错过了什么?我应该补充一点,我确实阅读了 PBP 的第 208 页和第 278 页,答案对我来说不清楚。
有没有人能够解决一次处理多行字符串的任务,除了下面显示的字符串作为文件句柄解决方案?
my $multiline_string = "line one\nline two\nline three\nline four";
my $filehandle;
open( $filehandle, '<', \$multiline_string )
or croak("Can't open multi-line string as a filehandle: $!");
while ( defined (my $single_line = <$filehandle>) ) {
# do some processing of $single_line here ...
}
close( $filehandle );
Run Code Online (Sandbox Code Playgroud)
我不想使用文件句柄的原因相当薄弱.Test :: Perl ::当我在任何文件句柄上打开命令和关闭命令之间有超过10个源代码行时,批评者会发牢骚.我正在对$ single_line进行相当多的处理,所以在我的公开通话和近距离通话之间我实际上有大约40行代码,我没有看到任何方法将其降低到10.
而且我真的不想忽略我的构建中的Perl :: Critic测试,因为这实际上是一个不错的测试,我想在我的代码中打开一个实际的磁盘文件时通过它.
我在WinXP SP3上运行带有EPIC 0.5.46和ActiveState ActivePerl 5.10.0的eclipse Galileo.
我刚刚使用包管理器下载了Perl :: Critic,并使用相应的Properties页面将其集成到eclipse中.
我可以从我的eclipse源上下文菜单中运行Perl :: Critic.它运行.但它没有在eclipse的源代码中添加任何标记......换句话说,我看不到它的结果.(我的Perl不太好.)
如果你告诉我RTFM,请指出哪个FM到R.感谢您的任何指示.
在Perl中,我可以这样做:
my @unit_indices = sort {
$units{$b}[0] <=> $units{$a}[0]
or
$a cmp $b
} keys %units;
Run Code Online (Sandbox Code Playgroud)
哪个按字段(数组元素)降序排序,另一个(散列键)按升序排序,但会导致perlcritic抱怨:
禁止在第X行第Y列的排序块$ a之前的$ b.参见PBP的第152页.(严重程度:1)
Perl Best Practices建议使用reverse.
但如果你写的话,操作会更容易理解:
@sorted_results = reverse sort @unsorted_results;
但是,我还没有找到一种让方向相反的子方法.
显然,我可以说perlcritic要忽略这一点,但我想知道如何完成我需要的事情并使之perlcritic快乐.
我习惯使用$selfOO Perl,即使我只编写自包含的脚本而根本没有命名我的包.例如,我script.pl会这样开始:
use strict;
use warnings;
my $self = bless {};
$self->time_stamp(localtime(time()));
1;
sub time_stamp {
my ($self,@args) = @_;
# Getter/setter
my $ftime_stamp;
if( 1 < scalar @args ) {
$ftime_stamp = strftime "%Y%m%d_%H%M%S", @args;
$self->{'time_stamp'} = $ftime_stamp;
}
return $self->{'time_stamp'};
}
[...]
Run Code Online (Sandbox Code Playgroud)
这些脚本有时会变成适当的模块,但有时我只是让它们成为这样的模块.
这虽然违背了Perl Critic的"一个论点的祝福":
One-argument "bless" used at line 162, column 12. See page 365 of PBP. Severity: 5
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方式来命名我的祝福,但仍然包含在我的一切script.pl?
perl ×10
perl-critic ×10
bless ×1
eclipse ×1
epic ×1
filehandle ×1
ipcopen3 ×1
lint ×1
multiline ×1
natural-sort ×1
oop ×1
sorting ×1