模块结束于" 1;",perlcritic抱怨它没有

时间:2015-07-16 15:02:12

标签: perl perl-critic

有一个简单的模块

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)

如何让perlcritic开心?

编辑 - 基于@ 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)

我的percritic:

$ perlcritic --version
1.125

1 个答案:

答案 0 :(得分:13)

来自method的{​​{1}}关键字似乎正在抛弃perlcritic。请注意PPI解析以下程序的方式不同:

Method::Signatures::Simple

使用$ 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被视为单独的声明。

要使perlcritic安静,可以在方法的右大括号后添加分号:

1;

或者

method func {
    ...
};

1;

但是,我认为amon在评论中提出了一个很好的观点:

  

perlcritic无法处理语法扩展,例如方法签名......由于这些问题,我倾向于在语法扩展和perlcritic之间做出选择 - 而且在大多数情况下,不得不更喜欢静态分析而不是语法糖。

相关问题