【问题标题】:Module ends in "1;", perlcritic complains that it doesn't模块以“1;”结尾,perlcritic 抱怨它没有
【发布时间】:2015-07-17 03:29:55
【问题描述】:

有一个简单的模块

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;

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 17, column 1.  Must end with a recognizable true value.  (Severity: 4)
Return value of flagged function ignored - say at line 18, column 5.  See pages 208,278 of PBP.  (Severity: 1)

如何让批评家开心?

编辑 - 基于@toolic 的评论

是的,整洁有助于解决第一个问题(但 Code is not tidy at line 1, column 1. 没有多大帮助的消息),因为差异是:

13c13
<     is => 'rw',
---
>     is      => 'rw',
18c18,19
<     say 'This is the func method from ' . __PACKAGE__ . ' with value: ', $self->root;
---
>     say 'This is the func method from ' . __PACKAGE__ . ' with value: ',
>       $self->root;

但还是得到了:

Module does not end with "1;" at line 17, column 1.  Must end with a recognizable true value.  (Severity: 4)
Return value of flagged function ignored - say at line 18, column 5.  See pages 208,278 of PBP.  (Severity: 1)

我的批评家:

$ perlcritic --version
1.125

【问题讨论】:

  • 第 17 行是您的 method func { ... } 声明的开始。似乎 perl 评论家认为这是您模块的结尾。
  • 只有 perl 才能解析 Perl。 perlcritic 无法处理诸如方法签名之类的语法扩展。它可能将method func { ... } 1; 解析为method(func(sub{ ... }, 1));,即1func 的参数。您可以通过在右大括号之后、最后一个 1; 之前放置一个分号来解决此问题。由于这些问题,我倾向于在语法扩展和 perlcritic 之间进行选择——遗憾的是,在大多数情况下,我不得不更喜欢静态分析而不是语法糖。
  • 不相关,但 Method::Signatures::Simple 还提供了一个 func 关键字,因此将方法命名为 func 可能会造成混淆。我假设您会在实际程序中使用更好的方法名称。 :)

标签: perl perl-critic


【解决方案1】:

看起来Method::Signatures::Simple 中的method 关键字正在引起批评。请注意 PPI 解析以下程序的方式不同:

$ tools/ppidump 'method foo { 1 } 1;'
                    PPI::Document
                      PPI::Statement
[    1,   1,   1 ]     PPI::Token::Word         'method'
[    1,   8,   8 ]     PPI::Token::Word         'foo'
                        PPI::Structure::Block   { ... }
                          PPI::Statement
[    1,  14,  14 ]         PPI::Token::Number   '1'
[    1,  18,  18 ]     PPI::Token::Number       '1'
[    1,  19,  19 ]     PPI::Token::Structure    ';'

$ tools/ppidump 'sub foo { 1 } 1;'
                    PPI::Document
                      PPI::Statement::Sub
[    1,   1,   1 ]     PPI::Token::Word         'sub'
[    1,   5,   5 ]     PPI::Token::Word         'foo'
                        PPI::Structure::Block   { ... }
                          PPI::Statement
[    1,  11,  11 ]         PPI::Token::Number   '1'
                      PPI::Statement
[    1,  15,  15 ]     PPI::Token::Number       '1'
[    1,  16,  16 ]     PPI::Token::Structure    ';'

当使用method时,整个程序被视为一条语句;使用sub 时,1; 被视为单独的语句。

为了让 perlcritic 保持安静,您可以在方法的右大括号后添加一个分号:

method func {
    ...
};

1;

或者

method func {
    ...
}

;1;

不过,我认为 amon 在 cmets 中提出了一个很好的观点:

perlcritic 无法处理诸如方法签名之类的语法扩展...由于这些问题,我倾向于在语法扩展和 perlcritic 之间进行选择——遗憾的是,在大多数情况下,我不得不更喜欢静态分析而不是语法糖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多