我有一个脚本,我试图使用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模块为文件句柄提供了一个很好的面向对象的接口,我认为无论如何它都更优雅.
Run Code Online (Sandbox Code Playgroud)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如果文件通过include语句明确声明它与5.6之前的perl版本兼容,则该策略不会抱怨,例如,其中包含"require 5.005".
我通过阅读perlcritic文档找到了这个.
要让 Perl Critic 闭嘴,但没有任何实际好处,只需将代码修改为:
\n\nopen(my $PIPE_FROM_FREESPCHK, "-|", $cmdline)\n || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\nRun Code Online (Sandbox Code Playgroud)\n\n但请注意,从更明显的角度来看,这在任何方面都绝对没有更好:
\n\nopen(my $PIPE_FROM_FREESPCHK, "$cmdline |")\n || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\nRun Code Online (Sandbox Code Playgroud)\n\n因为您没有分离出用于exec直接调用的令牌。那看起来更像是这样的:
open(my $PIPE_FROM_FREESPCHK, "-|", $cmd_name, @cmd_args)\n || zdie($MSG_PASSTHRU, "Error checking free space of file system.");\nRun Code Online (Sandbox Code Playgroud)\n\n问题是您正在运行 shell 命令还是只是 exec\xe2\x80\x99ing 某些东西。如果您的免费支票类似于df . 2>/dev/null | awk ....,那么您需要完整的外壳。如果只是df,那么您就不需要\xe2\x80\x99t。