标签: perl-critic

在这个perl代码中,$ _被修改在哪里?

以下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 natural-sort perl-critic

3
推荐指数
1
解决办法
369
查看次数

如何让Perl :: Critic在其输出中显示违规政策?

我被告知有可能Perl::Critic在其输出中显示违规的策略名称.但我不记得我要做些什么来打开它.怎么能在一个perlcritic.rc

perl configuration perl-critic

3
推荐指数
2
解决办法
323
查看次数

用于静态代码分析的 B::Lint 和 Perl::Critic

我需要为 Perl 中的静态代码分析实现 lint 和 Perl::Critic。我在 Perl 中找到了用于 lint 的 B::Lint 模块。

  1. 是否真的需要同时使用这两个模块进行静态代码分析?
  2. 如果是,那么这两个模块如何协同工作?

perl lint perl-critic static-code-analysis

3
推荐指数
1
解决办法
1344
查看次数

如何在osx上安装perl评论家?

我尝试下载,解压缩,按照说明操作:

  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)

perl perl-critic

3
推荐指数
1
解决办法
2700
查看次数

perl IPC:Open3最小通过perlcritic?

我正在阅读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 perl-critic ipcopen3

3
推荐指数
2
解决办法
144
查看次数

Perl::Critic 残酷模式

所以我最近开始使用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 页,答案对我来说不清楚。

perl perl-critic

3
推荐指数
1
解决办法
242
查看次数

当我使用文件句柄处理多行字符串时,如何避免使用Perl :: Critic警告?

有没有人能够解决一次处理多行字符串的任务,除了下面显示的字符串作为文件句柄解决方案?

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测试,因为这实际上是一个不错的测试,我想在我的代码中打开一个实际的磁盘文件时通过它.

perl multiline filehandle perl-critic

2
推荐指数
2
解决办法
527
查看次数

如何让Perl :: Critic与EPIC和eclipse一起工作?

我在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.感谢您的任何指示.

eclipse perl epic perl-critic

2
推荐指数
1
解决办法
4539
查看次数

如何在不使用Perl中的$ b(比较)$ a的情况下对一个键升序进行排序,另一个降序排序?

在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快乐.

sorting perl perl-critic

2
推荐指数
1
解决办法
294
查看次数

perl使用脚本和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

oop perl bless perl-critic

2
推荐指数
1
解决办法
274
查看次数