Лучший способ проверить, является ли аргумент именем файла или файлом, содержащим список имен файлов? - PullRequest
2 голосов
/ 24 августа 2011

Я пишу Perl-скрипт, и я хотел бы, чтобы пользователь ввел файл или файл, содержащий список файлов в $ ARGV [0].

Текущий способ, которымЯ делаю это, чтобы проверить, начинается ли имя файла с @, если это так, то я рассматриваю этот файл как список имен файлов.

Это определенно не идеальный способ сделать это, потому что язаметил, что @ - это специальный символ в bash (что, кстати, он делает? Я видел только, что он используется в $ @ в bash).

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Вы можете указать дополнительный параметр в командной строке, чтобы обрабатывать его по-разному, например,

perl script.pl file

для чтения файла или

perl script.pl -l file

для чтения списка файлов из file .

Вы можете использовать модуль getopt для более простого анализа входных аргументов.

1 голос
/ 25 августа 2011

Во-первых, вы можете использовать свою оболочку, чтобы получить список для вас:

perl script.pl <( cat list )

Если вы не хотите этого делать, возможно, потому что вы работаете с максимальной длиной командной строки, вы можетеперед тем, как использовать @ARGV или ARGV (включая <>), используйте следующее:

@ARGV = map {
   if (my $qfn = /^\@(.*)/s) {
      if (!open(my $fh, '<', $qfn)) {
          chomp( my @args = <$fh> );
          @args
      } else {
          warn("Can't open $qfn: $!\n");
          ()
      }
   } else {
      $_
   }
} @ARGV;

Имейте в виду, что у вас будут непреднамеренные побочные эффекты, если у вас есть файл, имя которого начинается с "@».

0 голосов
/ 25 августа 2011

'@' специально для Perl , поэтому вам нужно экранировать его в строках Perl - если только вы не используете неинтерполирующие типы строк 'a non-interpolating $string' или q(another non-interpolating $string) или вам нужно сбежать, вот так

if ( $arg =~ /^\@/ ) {
    ...
}

Интерполирующими разделителями являются любые из следующих:

  • "..." или qq/.../
  • `...` или qx/.../
  • /.../ или qr/.../

Для всех этих вам придется избегать любого буквального @.

В противном случае имя файла, начинающееся с @, имеет довольно хороший приоритет в аргументах командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...