Perlcritic-两个参数“;开放式;错误

Perlcritic-两个参数“;开放式;错误,perl,perl-critic,Perl,Perl Critic,我有一个脚本,我正试图用perlcritic消除不好的做法 我有一句话如下: open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system."); 这会产生以下错误: 第xxx行第x列使用了两个参数“open”。见PBP第207页。(严重程度:5) 关于如何修复它有什么想法吗?要让Perl批评家闭嘴,但根本没有什么好处,只需将代码修改为: open(my

我有一个脚本,我正试图用perlcritic消除不好的做法

我有一句话如下:

open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system.");
这会产生以下错误: 第xxx行第x列使用了两个参数“open”。见PBP第207页。(严重程度:5)


关于如何修复它有什么想法吗?

要让Perl批评家闭嘴,但根本没有什么好处,只需将代码修改为:

open(my $PIPE_FROM_FREESPCHK, "-|", $cmdline)
    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");
然而,请注意,从更明显的角度来看,这在任何方面都不是更好的:

open(my $PIPE_FROM_FREESPCHK, "$cmdline |")
    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");
因为您没有分离出直接调用
exec
的令牌。看起来更像这样:

open(my $PIPE_FROM_FREESPCHK, "-|", $cmd_name, @cmd_args)
    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");
问题是您是在运行shell命令,还是只是在执行某些操作。如果您的免费支票类似于
df。2> /dev/null | awk….
,那么您需要完整的shell。如果它只是
df
,那么您就不需要了。

如果您使用
--verbose 11
标志,您将得到更详细的错误解释。在这种情况下,您得到的错误如下所示:

open(my $PIPE_FROM_FREESPCHK, "-|", $cmd_name, @cmd_args)
    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");
两个参数“open”用于第6行,靠近“open FILE,'somefile';”
InputOutput::ProHibitWoArgOpen(严重性:5)

“open”的三参数形式(在Perl 5.6中引入)防止 文件名以有趣的字符开头时出现的细微错误
比如“>”或者“
$cmdline
中到底有什么内容?”?是文件还是别的什么?
##没有评论家
⁠ 答案基本上是正确的,但是在打开命令的情况下,
模式
参数应该是可读文件句柄的
'-|'
(您想读取命令的stdout)或
'|-'
可写文件句柄(您想写入命令的stdin)。没有更好的…除非它是。当命令以“>”开头时,您所谓的等效项不起作用(我通常使用“>”)。这就是批评的全部要点,所以谈谈遗漏要点。我喜欢使用自定义的
--详细格式
,其中包括
%P
。这显示了整个策略名称,这使我能够通过命令行上的快速复制粘贴,使用
perldoc
,轻松获得错误的完整解释:
perldoc Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen
  open( $fh, 'foo.txt' );       # BAD: Reader must think what default mode is
  open( $fh, '<', 'foo.txt' );  # GOOD: Reader can see open mode