Perlcritic - 两个参数"开放"错误

En-*_*ion 5 perl perl-critic

我有一个脚本,我试图使用perlcritic来贬低不良做法.

我有一行如下:

open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system.");
Run Code Online (Sandbox Code Playgroud)

这给出了这个错误:在xxx行x列使用了两个参数"open".参见PBP第207页.(严重程度:5)

关于如何修复它的任何想法?

Dav*_*oss 24

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

在第6行使用双参数"open",接近'open FILE',somefile';'.
InputOutput :: ProhibitTwoArgOpen(严重性:5)

"open"的三参数形式(在Perl 5.6中引入)可防止文件名以">"或"<"等有趣字符开头时出现的细微错误.IO :: File模块为文件句柄提供了一个很好的面向对象的接口,我认为无论如何它都更优雅.

 open( $fh, '>output.txt' );          # not ok
 open( $fh, q{>}, 'output.txt' );     # ok

 use IO::File;
 my $fh = IO::File->new( 'output.txt', q{>} ); # even better!
Run Code Online (Sandbox Code Playgroud)

定义文件的输入模式也更明确,因为这两者之间存在差异:

  open( $fh, 'foo.txt' );       # BAD: Reader must think what default mode is
  open( $fh, '<', 'foo.txt' );  # GOOD: Reader can see open mode
Run Code Online (Sandbox Code Playgroud)

如果文件通过include语句明确声明它与5.6之前的perl版本兼容,则该策略不会抱怨,例如,其中包含"require 5.005".

我通过阅读perlcritic文档找到了这个.


Tud*_*tin 1

要让 Perl Critic 闭嘴,但没有任何实际好处,只需将代码修改为:

\n\n
open(my $PIPE_FROM_FREESPCHK, "-|", $cmdline)\n    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\n
Run Code Online (Sandbox Code Playgroud)\n\n

但请注意,从更明显的角度来看,这在任何方面都绝对没有更好:

\n\n
open(my $PIPE_FROM_FREESPCHK, "$cmdline |")\n    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为您没有分离出用于exec直接调用的令牌。那看起来更像是这样的:

\n\n
open(my $PIPE_FROM_FREESPCHK, "-|", $cmd_name, @cmd_args)\n    || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题是您正在运行 shell 命令还是只是 exec\xe2\x80\x99ing 某些东西。如果您的免费支票类似于df . 2>/dev/null | awk ....,那么您需要完整的外壳。如果只是df,那么您就不需要\xe2\x80\x99t。

\n

  • 没有更好......除非它是。当命令以“&gt;”(我经常使用)开头时,您所谓的等效命令不起作用。这就是批评的全部要点,所以谈论没有抓住要点。 (3认同)