5

私はスクリプトを持っており、perlcritic を使用して悪い慣行を排除しようとしています。

私が持っている1行は次のとおりです。

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

これにより、次のエラーが発生します:行 xxx、列 x で使用される 2 つの引数「オープン」。PBP の 207 ページを参照してください。(重大度: 5)

それを修正する方法についてのアイデアはありますか?

4

2 に答える 2

24

フラグを使用する--verbose 11と、エラーのより詳細な説明が得られます。この場合、発生するエラーは次のようになります。

'open FILE、'somefile';'の近くの6行目で使用されている2つの引数"open"。
InputOutput :: ProhibitTwoArgOpen(重大度:5)

`open'の3つの引数形式(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!

また、次の2つの違いのように、ファイルの入力モードを定義することもより明確になります。

  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と互換性があることを明示的に示している場合、たとえば「require5.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.");

問題は、シェル コマンドを実行しているのか、それとも単に何かを実行しているのかということです。無料チェックが のようなものdf . 2>/dev/null | awk ....である場合は、完全なシェルが必要です。それがただdfの場合、そうではありません。

于 2011-12-19T12:00:11.553 に答える