2009-11-16 3 views
4

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

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

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

Формат файла, который передается в этот сценарий является

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

Я думаю, что это не сработает. Я думаю, что 'do' столкнется с конструкцией' do ... while'. – Geo

+2

выглядит так, как будто он читает файл и разбивает его на массив отдельных строк. –

+0

@Geo: no, команда 'do' также может использоваться для« источника »другого скрипта perl. – jheddings

ответ

12

Он делает это:

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

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

+1

Ваша вторая пуля не совсем правильная. $ ref является undef, если $ filename не найден или его невозможно скомпилировать. Проверка действительно должна быть изменена на «определенные $ ref или ...». – jamessan

+0

Хорошие моменты, теперь включены. Спасибо. :-) – Tim

4

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

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

+0

Не знал этого. Благодаря! – Geo

2

perldoc -f do

  • сделать EXPR

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

    do 'stat.pl'; 
    

    просто как

    eval `cat stat.pl`; 
    

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

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

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

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