Разбор текста программы

Приведём целиком текст программы:

#!/usr/bin/perl -w
# Первая программа — «Hello, world!»
print "Hello, world!\n";

Для того, чтобы создать программу и подготовить её к работе, нужно проделать следующие шаги:

Запустив текстовый редактор (vim), записать с его помощью файл с исходным текстом программы, назовём этот файл hello.pl:

Вновь записанный файл hello.pl сделаем исполняемым:

Попробуем запустить программу:

Если программа не заработает так, как задумано, нам, возможно, потребуется внести изменения в её текст. Тогда снова запустим vim и сохраним изменения (теперь уже нет необходимости повторно устанавливать атрибут исполняемости). Снова запустим программу.

Разберём программу по строчкам.

Первые две строки — комментарии. Это части программы, не оказывающие влияния на её исполнение. Они дают возможность программисту включить замечания либо для себя, либо для других программистов, либо для пользователей программы. Обычно в начале текста программы размещают комментарий, в котором описывается назначение программы и способ её использования, версия программы, сведения об авторе. Принято также комментировать трудные и нетривиальные места в тексте. Комментарии в Perl следуют сразу после знака # и простираются вплоть до конца строки. Если знак # является частью какой-то другой конструкции (скажем, строковой константы), он уже не будет обозначать начало строки-комментария.

Обратите внимание на первую строку. Она содержит особый комментарий. Чтобы понять его предназначение, выясним, что происходит, когда мы запускаем программу:

Программа-командная оболочка (в нашем случае zsh), та самая, что предлагает нам вводить после приглашения команды в командной строке, первым делом проверяет, чтобы файл ./hello.pl существовал, был читаемым и исполняемым (эти условия у нас выполнены). Затем оболочка «заглядывает» внутрь файла и по некоторым признакам определяет, содержит ли он текст на языке, понятном процессору — последовательность машинных инструкций. Если это так, файл загружается в память и процессор приступает к исполнению инструкций, записанных в нём. Но в нашем случае файл ./hello.pl содержит не машинные инструкции, а текст на языке Perl, а этот язык неизвестен процессору. Поэтому команды, записанные в файле, не могут быть исполнены непосредственно. Их нужно сначала перевести на язык машинных инструкций. Для этих целей служит программа-переводчик (компилятор, транслятор) perl, которая находится в файле /usr/bin/perl. Командная оболочка, не обнаружив машинные инструкции в файле, ищет в нём первую строку, начинающуюся с символов #!. Формируется команда, в начале которой помещается текст после #! (у нас /usr/bin/perl -w), добавляется пробел и название файла ./hello.pl. Эта команда запускается.

Таким образом, команда

равносильна команде

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

#!/usr/bin/perl -w

не было бы необходимости, да и файл ./hello.pl можно было бы не делать исполняемым. Но так получается длиннее.

Ключ -w при запуске программы perl указывает компилятору выдавать предупреждения о различных ненормальных ситуациях во время исполнения программы. Появление таких ненормальных ситуаций, как правило, свидетельствует об ошибках программирования, и использование ключа -w рекомендуется всегда. Альтернативный способ добиться того же эффекта — поместить в самом начале текста программы строку use warnings;:

#!/usr/bin/perl
# Первая программа — «Hello, world!»
use warnings;
print "Hello, world!\n";

С точки зрения языка Perl (и программы perl) особый комментарий в первой строке текста ничем не примечателен и не отличается от обычного комментария во второй строке. Он влияет лишь на способ запуска программы и предназначен для командной оболочки.

Чтобы прояснить последнюю мысль, рассмотрим следующий файл hello.cat:

#!/bin/cat
Hello, world!

Сделаем этот файл исполняемым и запустим его:

Программа cat, находящаяся в файле /bin/cat, как нам известно, выводит на экран содержимое файла, указанного в её командной строке. Согласно правилам, при запуске

формируется другая команда, которая и исполняется:

Третья строка

print "Hello, world!\n";

составляет, собственно, всю программу. В ней вызывается встроенная команда print языка Perl. Эта команда выводит строку "Hello, world!\n". Только почему-то при выводе мы не видим ни кавычек, ни таинственной комбинации \n. Почему? Дело в том, что кавычки не являются частью выводимой строки, это ограничители, которые ограничивают в тексте программы неизменяемые строки (строковые константы). Комбинация \n, напротив, является частью строки, и, хотя она содержит два символа, обозначает один символ — знак конца строки. В отличие от букв, цифр и знаков препинания, при выводе этого символа на экран никакое изображение не появляется, вместо этого обрывается строка, и дальнейший текст будет выведен начиная со следующей строки.

Посмотрим, что получилось бы, если бы мы забыли в программе \n.

Куда же делось приветствие, почему оно не вывелось? Оно вывелось, но мы его не видим, так как оно полностью закрыто приглашением командной строки, выскочившей сразу после завершения программы. Поскольку приветствие не завершается символом конца строки, приглашение будет выведено на той же самой строке, и затрёт приветствие.

Можно было бы обойтись и без комбинации \n:

print "Hello, world!
";

Но это некрасиво. Имеется множество подобных обозначений для символов, которые по какой-то причине неудобно включать в строковые константы непосредственно (например, текстовый редактор не позволяет этого, или символ отсутствует на клавиатуре). Такие обозначения называются литералами.

Наверное, читатели догадались, что точка с запятой ; завершает команды в языке Perl.

Информатика-54© А. Н. Швец