5

我有一个脚本,我正在尝试使用 perlcritic 消除不良做法。

我的一行如下:

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

这给出了这个错误:在第 xxx 行第 x 列使用了两个参数“打开”。参见 PBP 第 207 页。(严重性:5)

关于如何解决它的任何想法?

4

2 回答 2

24

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

两个参数“open”用在第 6 行,靠近 '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!

定义文件的输入模式也更加明确,如这两者之间的区别:

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

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

我通过阅读perlcritic文档发现了这一点。

于 2011-12-19T12:41:38.250 回答
1

为了让 Perl Critic 闭嘴,但根本没有真正的好处,只需将代码修改为:

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 ....,那么您需要完整的外壳。如果它只是df,那么你不会。

于 2011-12-19T12:00:11.553 回答