Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
残酷模式下的Perl::Critic_Perl_Perl Critic - Fatal编程技术网

残酷模式下的Perl::Critic

残酷模式下的Perl::Critic,perl,perl-critic,Perl,Perl Critic,因此,我最近开始使用Perl::Critic检查我编写的代码的质量。我在残酷的模式下运行它,它提出了一个建议,我不认为这是一个问题。输出为: 忽略标记函数的返回值-在第197行第13列打印。见PBP第208278页。(严重性:1) 这基本上是对打印功能的调用,并向控制台输出一条短消息。那么,为什么我要捕获返回值,它几乎肯定总是1,因为我想不出任何用例中的返回值不是1 残暴模式是否“太残暴”?还是我遗漏了什么?我应该补充一点,我确实阅读了PBP的第208页和第278页,但我不清楚答案。我同意大多数

因此,我最近开始使用
Perl::Critic
检查我编写的代码的质量。我在残酷的模式下运行它,它提出了一个建议,我不认为这是一个问题。输出为:

忽略标记函数的返回值-在第197行第13列打印。见PBP第208278页。(严重性:1)

这基本上是对打印功能的调用,并向控制台输出一条短消息。那么,为什么我要捕获返回值,它几乎肯定总是1,因为我想不出任何用例中的返回值不是1


残暴模式是否“太残暴”?还是我遗漏了什么?我应该补充一点,我确实阅读了PBP的第208页和第278页,但我不清楚答案。

我同意大多数时间
打印不会失败。但是,您可以通过创建
.perlcriticrc
文件并向其中添加以下行来禁用此函数(就像我所做的那样):

这在中进行了描述

此外,如果您不同意残忍设置的所有策略,您可以使用其他4种不那么残忍的设置中的一种。该工具是高度可配置的

这是一个很小的情况,
打印
可能会失败(打印到关闭的文件句柄):

在这么短的代码中,很明显您只是关闭了文件句柄,然后就再也不会尝试打印到它了。但是,如果你有很多(设计糟糕的)代码,可能会发生这种情况

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


我为自己创建了一个脚本来运行
perlcritic
,这样就可以很容易地访问给定策略的POD:

一个用例,其中
打印“某物”失败是指标准输出已打开到文件且文件系统已满。但在我的项目中,我也不会检查
print

的返回值来实现

打印“$updated\u service\u name\n”;
使用

my$printed=(打印“$updated\u service\u name\n”);
如果(!$printed){
die“无法写入标准输出\n”;
}

有趣的故事:当我们在核电站控制计算机上进行磁盘写入时,我们没有检查错误。也就是说,磁盘空间不足是不可能的(因为磁盘没有文件系统,而且空间是在开发过程中手动分配的),所以唯一可能的错误是编码错误和磁盘故障。如果磁盘出现故障,整个计算机都会失败,因为程序必须每100毫秒左右从磁盘加载一次(以便在32千瓦的RAM上实现多任务)。根本没有必要检查错误。
# Check all builtins except "print"
[InputOutput::RequireCheckedSyscalls]
functions = :builtins
exclude_functions = 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";