标签: perl-critic

子程序是否应该明确返回?

如果perlcritic说"没有子回报是错误的",如果真的不需要它们会有什么选择?

我养成了两个显然不好的习惯:

  • 我明确地将变量分配给'$ main ::'命名空间.
  • 然后我在subs中使用那些变量.

例如,我可能会..

#!/usr/bin/perl
use strict;
use warnings;

@main::array = (1,4,2,6,1,8,5,5,2);

&sort_array;
&push_array;
&pop_array;

sub sort_array{
    @main::array = sort @main::array;
    for (@main::array){
        print "$_\n";
    }
}

sub push_array{
    for ( 1 .. 9 ){
        push @main::array, $_;
    }
}

sub pop_array {
    for ( 1 .. 3 ){
        pop @main::array;
    }
}
Run Code Online (Sandbox Code Playgroud)

我不是一直这样做的.但在上面,它是有道理的,因为我可以隔离操作,而不必担心来回传递值,它通常看起来整洁.

但正如我所说,perl评论家说错了 - 因为没有回报......

那么,是否有人能够解释我正在尝试做什么并建议在perl中采用这种编码风格的更好方法?例如.我有点做OOP吗?

oop perl function subroutine perl-critic

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

Perlcritic:我该如何解析'^ Magic变量“ $ ENV”应该分配为“ local”'?

我正在编写一个Perl脚本,该脚本需要在调用外部程序之前设置许多环境变量。我的代码具有以下形式

$ENV{'VAR1'}    = "value1";
$ENV{'VAR2'}    = "value2";
Run Code Online (Sandbox Code Playgroud)

通过perlcritic运行此程序时,每次此类分配都会收到严重性为4的违规:

^Magic variable "$ENV" should be assigned as "local"
Run Code Online (Sandbox Code Playgroud)

谷歌搜索该错误消息并没有给我任何好的解决方案。在这种情况下,抱怨的过激冲突是Variables :: RequireLocalizedPunctuationVars,给出的示例涉及本地化文件句柄。我试图在Perl最佳实践中找到相关的部分,但它仅涉及本地化软件包变量。

我尝试的一种解决方案是在分配之前使用以下语句本地化%ENV。

local %ENV = ();
Run Code Online (Sandbox Code Playgroud)

这不能解决违规问题。

我的问题如下:

这种Perlcritic违规行为甚至与%ENV的分配相关,还是我可以忽略它?

如果相关,解决它的最佳方法是什么?

perl environment-variables perl-critic

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

让Perl警告我缺少未使用的功能

perl -wle 'if (0) {no_such_func()}'
Run Code Online (Sandbox Code Playgroud)

尽管使用了-w,但上面的运行没有错误,因为从不调用no_such_func().

如何让Perl检查我引用的所有函数/模块,即使是我不使用的函数/模块?

在更现实的情况下,某些功能可能只在特殊情况下调用,但我仍然希望确保它们存在.

编辑:我安装了perlcritic,但我认为我仍然做错了.我创建了这个文件:

#!/bin/perl -w   
use strict; 
if (0) {no_such_func();}
Run Code Online (Sandbox Code Playgroud)

并且perlcritic说它很好("来源好").当然静态分析可以捕获no_such_func()的不存在?该程序也运行良好(并没有产生输出).

perl perl-critic

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

使用eval插入变量时,请避免使用PerlCritic

perlcritic在下面的代码的第一个评估线上抱怨表达形式为"eval"[BuiltinFunctions :: ProhibitStringyEval]:

use strict;
use warnings;
use feature qw/say/;

my $hasTwitter = 1;
my $validEmail = 0;

my $rule   = '${hasTwitter} | ${validEmail}';
my $result = eval $rule;
say "Result ->  $result";

$result = eval { $rule };
say "Result -> $result";
Run Code Online (Sandbox Code Playgroud)

我尝试使用eval {}来修复perlCritic但是它不会返回预期的结果.

回应是:

Result ->  1
Result -> ${hasTwitter} | ${validEmail}
Run Code Online (Sandbox Code Playgroud)

是否有使用字符串插值的解决方法?我们的想法是在配置文件上有一组规则,让代码读取并评估它们.

谢谢

perl interpolation perl-critic

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

Perl + PerlCritic | 循环迭代器不是词法

我有这个代码

...
    my $line = '';
        foreach $line ( split( /\n/x, $raw ) ) {
            chomp $line;
            my ( $key, $val ) = split( /=/x, $line );
            $param{$key} = $val;
        }
...
Run Code Online (Sandbox Code Playgroud)

在perlcritic检查后,我得到一些消息"循环迭代器不是词法." 怎么了?

我可以用

 #my $line = '';
            foreach my $line ( split( /\n/x, $raw ) )
Run Code Online (Sandbox Code Playgroud)

但为什么?:)

perl perl-critic

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

perlcritic 消息:在 void 上下文中使用的映射

下面有一个 Perl 代码行,我从中获取消息perlcritic

map { $total_ids += scalar @{$ids->{$_}} } @brands;
Run Code Online (Sandbox Code Playgroud)

消息是:

"map" used in void context near 'map { $total_ids += scalar @{$ids->{$_}} } @brands;'
Run Code Online (Sandbox Code Playgroud)

谁能帮我解决它吗?

perl void perl-critic

0
推荐指数
1
解决办法
141
查看次数