【问题标题】:Perlcritic - Two argument "open" errorPerlcritic - 两个参数“打开”错误
【发布时间】:2012-01-23 13:32:29
【问题描述】:

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

我的一行如下:

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

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

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

【问题讨论】:

  • $cmdline 到底是什么?是文件还是别的什么?
  • ## no critic⁠ 是您解决这个问题以及所有其他喋喋不休的消极情绪所需要的一切。

标签: perl perl-critic


【解决方案1】:

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

在第 6 行使用了两个参数“open”,靠近 'open FILE, 'somefile';'。
InputOutput::ProhibitTwoArgOpen(严重性:5)

“open”的三参数形式(在 Perl 5.6 中引入)防止 当文件名以有趣的字符开头时发生的细微错误 像“>”或“

 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

如果文件明确声明它是 通过 include 语句与 5.6 之前的 perl 版本兼容, 例如通过在其中添加“require 5.005”。

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

【讨论】:

  • 我喜欢使用自定义的--verbose FORMAT,其中包括%P。这向我显示了整个策略名称,这使我可以使用 perldoc 轻松获得错误的完整解释,通过在我的命令行上快速复制粘贴:perldoc Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen
【解决方案2】:

要让 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&gt;/dev/null | awk ....,那么您需要完整的shell。如果只是df,那你就不用。

【讨论】:

  • 答案基本上是正确的,但是在打开命令的情况下,mode 参数应该是'-|' 用于可读的文件句柄(你想读取命令的标准输出)或@987654329 @ 一个可写的文件句柄(你想写入一个命令的标准输入)。
  • 没有任何更好的......除非它是。当命令以“>”(我很常用)开头时,您所谓的等效项不起作用。这就是批评的全部重点,所以谈谈没有抓住重点。
猜你喜欢
  • 2017-11-20
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2015-09-21
相关资源
最近更新 更多