Шаг 90.
Операция "документ здесь"

    На этом шаге мы рассмотрим операцию "документ здесь".

    В 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. Это не приводит к двусмысленностям и ошибкам компиляции, так как компилятор ищет первую после операции << строку с завершающим идентификатором. Главное, чтобы завершающий идентификатор в строке завершения был задан именно так, как он задан в самой операции.


    Замечание. При использовании операции "документ здесь" с завершающим идентификатором в обратных кавычках в некоторых операционных системах может возникнуть проблема с обработкой потока команд, определяемого в нескольких строках. Не все командные интерпретаторы могут обрабатывать несколько строк команд. Обычно они ориентированы на ввод команды в строке ввода, выполнения ее и ожидания следующего ввода команды. Некоторые командные оболочки могут обрабатывать несколько команд, заданных в одной строке через разделитель, например, командный интерпретатор cmd системы Windows NT, в котором разделителем служит символ &.

    Если завершающий идентификатор в операции << задан без кавычек, то он должен следовать за знаком операции без каких-либо пробелов. Если такое случается, то Perl интерпретирует эту операцию с завершающим идентификатором пустая строка " " и ищет в тексте программы первую пустую строку, ограничивающую строковые данные этой операции:

$var = "Александр"; 
print << x2;        # Отобразит 2 раза следующие  3  строки:
Пользователь:       #  Пользователь:
\t$var              #         Александр
x2                  #  x2
                    #  Пустая строка  завершает  операцию <<

    В этом фрагменте кода ошибочно поставлен пробел перед завершающим идентификатором х2. Компилятор разобрал строку с операцией печати print следующим образом: строковые данные, вводимые операцией <<, завершаются пустой строкой, после чего они просто повторяются 2 раза (последовательность символов х2 понимается как операция повторения строки х с правым операндом равным 2).


    Замечание. Этот пример подобран специально таким образом, чтобы он нормально отком-пилировался. Если вместо идентификатора х2 поставить, например FIRST, то компилятор сгенерирует ошибку.

    Результат выполнения операции "документ здесь" можно использовать в качестве операнда строковых операций. Можно даже использовать несколько операций << в одном операторе, расположив строки их данных последовательно друг под другом, не забыв, конечно, строки с завершающим идентификатором:

#! perl -w
$stack = <<"ONE".<<"TWO";
Первый
операнд
ONE
Второй
операнд
TWO
print $stack;
Текст этого примера можно взять здесь.

    Значением скалярной переменной $stack будет следующая строка:


Рис.2. Значение скалярной переменной $stack

    На следующем шаге мы приведем общие сведения о выражениях.




Предыдущий шаг Содержание Следующий шаг