【问题标题】:Perl::Critic in Brutal ModePerl::Critic in Brutal Mode
【发布时间】:2020-04-26 10:59:36
【问题描述】:

所以我最近开始使用Perl::Critic 来检查我编写的代码的质量。我正在以残酷的模式运行它,并提出了一个我不理解为问题的建议。输出是:

Return value of flagged function ignored - print at line 197, column 13. See pages 208,278 of PBP. (Severity: 1)

这基本上是对 print 函数的调用,并带有一条输出到控制台的短消息。那我为什么要捕获几乎可以肯定总是为 1 的返回值,因为我想不出任何不是 1 的用例。

野蛮模式是不是“太野蛮”了?还是我错过了什么?我应该补充一点,我确实阅读了 PBP 的第 208 页和第 278 页,但我并不清楚答案。

【问题讨论】:

    标签: perl perl-critic


    【解决方案1】:

    我同意大多数时候print 不会失败。但是,您可以通过创建.perlcriticrc 文件并将这些行添加到其中来禁用此功能(就像我一样):

    # Check all builtins except "print"
    [InputOutput::RequireCheckedSyscalls]
    functions = :builtins
    exclude_functions = print
    

    这在Perl::Critic::Policy::InputOutput::RequireCheckedSyscalls中有描述

    此外,如果您不同意残酷设置的所有政策,您可以只使用其他 4 个不那么残酷的设置之一。该工具是高度可配置的。

    这是print 可能失败的一个小例子(打印到关闭的文件句柄):

    open my $fh, '>', 'out';
    print $fh "555\n";
    close $fh;
    print $fh "888\n" or die "print failed: $!";
    
    # we shouldn't get here
    print "777\n";
    

    在如此短的代码中,很明显您只是关闭了文件句柄,然后您将永远不会尝试打印到它。但是,如果你有很多(设计不佳的)代码,它可能会发生。

    print 可能会失败还有其他原因,例如如果另一个进程出现并删除了目录或禁用了对您打开的文件的写入权限。

    我为自己创建了一个脚本来运行 perlcritic,它可以轻松访问给定策略的 POD:Sort and summarize perlcritic output

    【讨论】:

      【解决方案2】:

      print "something"; 失败的一个用例是当 STDOUT 已打开文件且文件系统已满时。但在我的项目中,我也不检查print 的返回值。

      【讨论】:

      • 有趣的故事:当我们在核电站控制计算机上进行磁盘写入时,我们没有检查错误。也就是说,磁盘空间不可能用完(因为磁盘没有文件系统,并且空间是在开发过程中手动分配的),所以唯一可能的错误是编码错误和磁盘故障。如果出现磁盘故障,整个计算机都会出现故障,因为程序必须每 100 毫秒左右从磁盘加载一次(以在 32 KiW 的 RAM 上实现多任务)。根本没有必要检查错误。
      【解决方案3】:

      实施修复

      print "$updated_service_name\n";
      

      使用

      my $printed = (print "$updated_service_name\n");
      if (!$printed) {
        die "Unable to write to stdout\n";
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-27
        • 2022-12-27
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多