Perlcritic - ошибка двух аргументов "open" - PullRequest
5 голосов
/ 19 декабря 2011

У меня есть сценарий, и я пытаюсь выявить плохие практики, используя perlcritic.

Одна строка, которую я имею, выглядит следующим образом:

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

Это выдает эту ошибку: «Два аргумента»open »используется в строке ххх, столбце х.Смотрите страницу 207 PBP.(Уровень серьезности: 5)

Есть идеи, как это исправить?

Ответы [ 2 ]

24 голосов
/ 19 декабря 2011

Если вы используете флаг --verbose 11, вы получите гораздо более подробное объяснение ошибки.В этом случае ошибка, которую вы получаете, выглядит следующим образом:

Два аргумента "open" используются в строке 6 рядом с 'open FILE,' somefile ';'.
InputOutput ::ProhibitTwoArgOpen (Severity: 5)

Форма с тремя аргументами «open» (введена в Perl 5.6) предотвращает скрытые ошибки, возникающие, когда имя файла начинается с забавных символов, таких как «>» или «<».Модуль IO :: File предоставляет приятный объектно-ориентированный интерфейс для файловых дескрипторов, который, на мой взгляд, более элегантен. </p>

 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

Эта политика не будет жаловаться, если файл явно заявляет, что он совместим с версией perl до 5.6 через оператор включения, например, имея в нем `require 5.005 '.

Я нашел это, прочитав документацию perlcritic .

1 голос
/ 19 декабря 2011

Чтобы заставить 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, значит, нет.

...