Чего добивается этот Perl-скрипт? - PullRequest
4 голосов
/ 16 ноября 2009

Я просматривал Perl-скрипт, написанный кем-то другим, и я не слишком знаком с Perl, поэтому кто-то может дать мне знать, что делают первые три строки?

my $ref = do($filename);
$ref != 0 or die "unable to read/parse $filename\n";
@varLines=@{$ref};
foreach $ord (@varLines)
{
    # code here
}

Это в начале программы после установки $filename с получением аргументов командной строки

Формат файла, передаваемого в этот скрипт,

[
  {
    "Key1" => "val1",
    "key2" => " "A",
  },
  {
    "Key3" => "val2",
    "key4" => " "B",
  },
]

Ответы [ 3 ]

12 голосов
/ 16 ноября 2009

Это делает это:

  • my $ref = do($filename) выполняет код Perl в файле с именем $filename ( ref ) и присваивает $ref значение последней команды в файле
  • $ref != 0 or die … предназначен для прерывания, если последняя команда в $filename не была успешной (см. Комментарии ниже для обсуждения)
  • @varLines=@{$ref}; предполагает, что $ref является ссылкой на массив, и инициализирует @varLines содержимым этого массива
  • foreach $ord (@varLines) { … } выполняет некоторый код для каждого из элементов в массиве, вызывая каждый из $ord на время цикла

Критически все зависит от того, что находится в файле с именем $filename.

4 голосов
/ 16 ноября 2009

Команда do выполнит указанное имя файла в виде сценария Perl и вернет значение последнего выражения в файле. Итак, я предполагаю, что файл, по которому выполняется действие, возвращает ссылку на массив.

Следующий блок просто перебирает элементы в этом возвращенном массиве.

2 голосов
/ 16 ноября 2009

perldoc -f do

  • до EXPR

    Использует значение EXPR в качестве имени файла и выполняет содержимое файла в виде сценария Perl.

    do 'stat.pl';
    

    так же, как

    eval `cat stat.pl`;
    

    за исключением того, что он более эффективен и лаконичен, отслеживает текущее имя файла для сообщений об ошибках, ищет каталоги @INC и обновляет %INC, если файл найден. См. «Предопределенные имена» в perlvar для этих переменных. Он также отличается тем, что код, оцененный с помощью do FILENAME, не может видеть лексические выражения во вложенной области видимости; eval STRING делает. Однако это то же самое, что он выполняет повторный анализ файла каждый раз, когда вы его вызываете, так что вы, вероятно, не хотите делать это внутри цикла.

В этом случае представляется, что ожидается, что содержимое $filename даст результат, похожий на

[
  "line1",
  "line2",
  "line3",
]

и цикл foreach обработает каждый элемент.

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