На этом шаге мы рассмотрим операцию "документ здесь".
В Perl реализована еще одна интересная возможность "ввода" строковых данных в программу, которая основана на синтаксисе "документ здесь" командного интерпретатора shell системы UNIX. Она позволяет определить в программе строковые данные большого объема, расположенные в нескольких последовательных строках текста программы, и использовать их в качестве операндов разных операций: присваивания, печати и т. п.
Ее синтаксис прост: после знака операции << задается завершающий идентификатор, который служит признаком окончания задания строковых данных. Это означает, что все строки данных, расположенные между текущей строкой, содержащей операцию "документ здесь" и строкой, содержащей завершающий идентификатор, рассматриваются как единый фрагмент строковых данных:
$multi_line_string = <<LINES; строка 1 строка 2 LINES
В приведенном фрагменте кода скалярная переменная $multi_line_string будет содержать строку "строка 1\nстрока 2\n". Как видим, введенные нами с клавиатуры символы перехода на новую строку сохраняются при использовании операции "документ здесь". По умолчанию операция "документ здесь" интерпретирует содержимое всех строк программы до завершающего идентификатора как строковые данные, заключенные в двойные кавычки, сохраняя в них символ перехода на новую строку "\n". Perl позволяет явно указать, как будут интерпретироваться данные при этой операции, заключив в двойные кавычки завершающий идентификатор операции. Следующие две операции "документ здесь" эквивалентны:
print <<m; line 1 m print <<"m"; line 1 m
Идентификатор можно задавать и в одинарных кавычках, и в обратных кавычках. В этом случае содержимое последующих строк программы до строки, содержащей завершающий идентификатор, трактуется как строковые данные в соответствующих кавычках.
При задании завершающего идентификатора в кавычках на строковые данные распространяются все правила подстановок переменных и управляющих символов, применяемые к строкам, ограниченным соответствующим типом кавычек. Следующий пример демонстрирует использование различных кавычек в операции "документ здесь".
#! perl -w
$var = "Александр";
print <<FIRST;
Пользователь: \t$var
FIRST
print <<'FIRST';
Пользователь: \t$var
FIRST
$com1 = "echo Alex";
print <<`FIRST`;
$com1
FIRST
Результат работы скрипта изображен на рисунке 1.
Рис.1. Результат работы приложения
Обратите внимание, что в этом примере использовался одинаковый завершающий идентификатор FIRST. Это не приводит к двусмысленностям и ошибкам компиляции, так как компилятор ищет первую после операции << строку с завершающим идентификатором. Главное, чтобы завершающий идентификатор в строке завершения был задан именно так, как он задан в самой операции.
Если завершающий идентификатор в операции << задан без кавычек, то он должен следовать за знаком операции без каких-либо пробелов. Если такое случается, то Perl интерпретирует эту операцию с завершающим идентификатором пустая строка " " и ищет в тексте программы первую пустую строку, ограничивающую строковые данные этой операции:
$var = "Александр"; print << x2; # Отобразит 2 раза следующие 3 строки: Пользователь: # Пользователь: \t$var # Александр x2 # x2 # Пустая строка завершает операцию <<
В этом фрагменте кода ошибочно поставлен пробел перед завершающим идентификатором х2. Компилятор разобрал строку с операцией печати print следующим образом: строковые данные, вводимые операцией <<, завершаются пустой строкой, после чего они просто повторяются 2 раза (последовательность символов х2 понимается как операция повторения строки х с правым операндом равным 2).
Результат выполнения операции "документ здесь" можно использовать в качестве операнда строковых операций. Можно даже использовать несколько операций << в одном операторе, расположив строки их данных последовательно друг под другом, не забыв, конечно, строки с завершающим идентификатором:
#! perl -w
$stack = <<"ONE".<<"TWO";
Первый
операнд
ONE
Второй
операнд
TWO
print $stack;
Значением скалярной переменной $stack будет следующая строка:
Рис.2. Значение скалярной переменной $stack
На следующем шаге мы приведем общие сведения о выражениях.