我有一个脚本,我正在尝试使用 perlcritic 消除不良做法。
我的一行如下:
open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system.");
这给出了这个错误:在第 xxx 行第 x 列使用了两个参数“打开”。参见 PBP 第 207 页。(严重性:5)
关于如何解决它的任何想法?
我有一个脚本,我正在尝试使用 perlcritic 消除不良做法。
我的一行如下:
open(my($FREESPCHK), $cmdline ) || &zdie($MSG_PASSTHRU,"Error checking free space of file system.");
这给出了这个错误:在第 xxx 行第 x 列使用了两个参数“打开”。参见 PBP 第 207 页。(严重性:5)
关于如何解决它的任何想法?
如果您使用该--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文档发现了这一点。
为了让 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
,那么你不会。