Язык Perl, созданный Ларри Уоллом (Larry Wall), был первым из самых популярных языков написания сценариев. Он предлагает чрезвычайно больше возможностей, чем bash, а написанные на нем программы (если они написаны хорошо) довольно просты для понимания. Поскольку в языке Perl не предусмотрена обязательность соблюдения раз работчиками стилистических правил создания кода, читабельность Perl-кода зависит от их дисциплинированности. Не без основания Perl называют языком “только для записи”.
#!/usr/bin/perl
print "Привет, мир!\n";
$ chmod +х helloworld
$ ./helloworld
Привет, мир!
11 Поскольку знаки “точка с запятой” являются разделителями, а не ограничителями (терми наторами), последнюю точку с запятой в блоке ставить необязательно.
Глава 2. Сценарии и командная оболочка97
#!/usr/bin/perl
@items = ("носки", "туфли", "шорты");
printf "Есть %d вида одежды.\n", $#items + 1;
print "Наденьте ${items[2]} первыми, затем ", join(" и ", @items[0,1]), ".\n";
$ perl clothes
Есть 3 вида одежды.
Наденьте шорты первыми, затем носки и туфли.
В этих нескольких строках сценария есть много интересного. Рискуя отвлечь ваше внимание, мы все же включаем в каждый наш Perl-пример несколько распространен ных идиом, разъясняя сложные моменты в тексте, следующем за примером. Если вы внимательно прочитаете все пояснения к примерам (не пугайтесь, они короткие!), то к концу этой главы приобретете практические знания в использовании большинства рас пространенных Perl-конструкций.
@iterns = (носки, туфли, шорты);
Такие строки без кавычек называются в Perl “голыми словами” (barewords), и они интерпретируются таковыми в качестве “последнего средства”. Это значит, что, если для некоторого объекта невозможно найти смысловую нагрузку, Perl пытается интерпрети ровать его как строку. В некоторых случаях это имеет смысл, если сохранится читабель ность кода. Однако наш пример не относится к таким случаям. Даже если вы сами пред-
98Часть I. Основы администрирования
почитаете всегда заключать строки в кавычки, будьте готовы к тому, что вам придется “разгадывать” намерения других программистов, разбираясь в их “голословном” коде.
В Perl существует еще один способ инициализировать этот массив. Он состоит в ис пользовании оператора qw (quote words — т.е. брать слова в кавычки). Это, по сути, фор ма заключения строки в кавычки, которая предоставляет вам право самим выбирать раз делители (как и во многих других случаях использования кавычек в Perl). Форма
@items = qw (носки туфли шорты);
является самой традиционной, но при этом может ввести в заблуждение, поскольку часть после оператора qw — уже не список. В действительности это строка, разделенная пробельными символами для формирования списка. Версия
@items = qw [носки туфли шорты];
тоже работает и, пожалуй, точнее передает смысл происходящего. Обратите внимание на то, что запятых здесь нет, поскольку их нагрузку “взял на себя” оператор qw.
join(" и ", @items[0,l])
функция join получает три строковых аргумента: " и ", "носки" и "туфли". Она конкатенирует свой второй и последующие аргументы, вставляя между каждой парой копию первого аргумента. В результате получаем “носки и туфли”.
Здесь описывается версия Perl 5, которая была стандартом в течение последнего деся тилетия. Версия Perl 6 все еще находится в стадии разработки. Подробнее можно узнать на сайте perl6.org. Языки Perl и Python (см. раздел 2.5) больше подходят для работы в области системного администрирования, чем такие традиционные языки программиро вания, как С, C++, C# и Java. Их отличает большая эффективность: при лаконичности кода и менее мучительном процессе отладки, а также без компиляционной “волокиты” они могут продемонстрировать большие возможности.
Выбор языка обычно зависит от личных предпочтений или стандартов, используемых вашим работодателем. Как Perl, так и Python предлагают библиотеки модулей и языковые расширения. По популярности язык Perl “старше”, чем Python, поэтому его предложения “вылились” в довольно длинный список возможностей. Но при решении каждодневных задач системного администрирования библиотеки поддержки обоих языков практически эквивалентны.
Для языка Perl характерен следующий девиз: “Достичь цель можно несколькими путями”. Поэтому имейте в виду, что в большинстве примеров, описанных в этом разделе, существуют и другие (помимо приведенного здесь) способы выполнения поставленной задачи.
Операторы Perl разделяются точкой с запятой.11 Комментарии начинаются знаком # и продолжаются до конца строки. Блоки операторов заключаются в фигурные скобки. Вот пример простой программы “Привет, мир!”.
Выбор языка обычно зависит от личных предпочтений или стандартов, используемых вашим работодателем. Как Perl, так и Python предлагают библиотеки модулей и языковые расширения. По популярности язык Perl “старше”, чем Python, поэтому его предложения “вылились” в довольно длинный список возможностей. Но при решении каждодневных задач системного администрирования библиотеки поддержки обоих языков практически эквивалентны.
Для языка Perl характерен следующий девиз: “Достичь цель можно несколькими путями”. Поэтому имейте в виду, что в большинстве примеров, описанных в этом разделе, существуют и другие (помимо приведенного здесь) способы выполнения поставленной задачи.
Операторы Perl разделяются точкой с запятой.11 Комментарии начинаются знаком # и продолжаются до конца строки. Блоки операторов заключаются в фигурные скобки. Вот пример простой программы “Привет, мир!”.
#!/usr/bin/perl
print "Привет, мир!\n";
Как и для bash-программ, вы должны либо изменить права доступа (chmod +х) для исполняемого файла, либо непосредственно вызвать Реrl-интерпретатор.
$ chmod +х helloworld
$ ./helloworld
Привет, мир!
Строки в Регl-сценарии не являются командами оболочки (они представляют собой Perl-код). В отличие от командной оболочки bash, которая позволяет объединить неко торую последовательность команд в сценарий, Perl не “видит дальше своего носа”, если ему не дать соответствующего указания. Тем не менее Perl обеспечивает действие многих таких же соглашений, которые действуют в оболочке bash, например использование об ратных апострофов, заключающих в себя некоторую команду, для перехвата результата выполнения этой команды.
11 Поскольку знаки “точка с запятой” являются разделителями, а не ограничителями (терми наторами), последнюю точку с запятой в блоке ставить необязательно.
Глава 2. Сценарии и командная оболочка97
Переменные и массивы
В Perl используются три базовых типа данных: скаляры (т.е. такие унитарные значе ния, как числа и строки), массивы и хеши (известные также как ассоциативные масси вы). Тип переменной всегда очевиден, поскольку он “встроен” в имя переменной: ска лярные переменные начинаются знаком “$”, переменные массивов — символом и хеш-переменные — знаком “%”.
В Perl понятия “список” и “массив” часто взаимозаменяемы, но, пожалуй, коррек
тнее сказать, что список — это некоторая последовательность значений, а массив — это переменная, которая может содержать такой список. Отдельные элементы массива явля ются скалярами, поэтому, подобно обычным скалярным переменным, их имена начина ются со знака “$”. Индексация массивов начинается с нуля, а индекс самого последнего элемента в массиве @а определяется значением $#а. Чтобы получить размер массива, достаточно добавить к этому значению единицу.
Массив @ARGV содержит аргументы командной строки сценария. Его можно исполь зовать подобно любому другому массиву.
Пример использования массивов демонстрирует следующий сценарий.
В Perl понятия “список” и “массив” часто взаимозаменяемы, но, пожалуй, коррек
тнее сказать, что список — это некоторая последовательность значений, а массив — это переменная, которая может содержать такой список. Отдельные элементы массива явля ются скалярами, поэтому, подобно обычным скалярным переменным, их имена начина ются со знака “$”. Индексация массивов начинается с нуля, а индекс самого последнего элемента в массиве @а определяется значением $#а. Чтобы получить размер массива, достаточно добавить к этому значению единицу.
Массив @ARGV содержит аргументы командной строки сценария. Его можно исполь зовать подобно любому другому массиву.
Пример использования массивов демонстрирует следующий сценарий.
#!/usr/bin/perl
@items = ("носки", "туфли", "шорты");
printf "Есть %d вида одежды.\n", $#items + 1;
print "Наденьте ${items[2]} первыми, затем ", join(" и ", @items[0,1]), ".\n";
Результат выполнения этого сценария таков.
$ perl clothes
Есть 3 вида одежды.
Наденьте шорты первыми, затем носки и туфли.
В этих нескольких строках сценария есть много интересного. Рискуя отвлечь ваше внимание, мы все же включаем в каждый наш Perl-пример несколько распространен ных идиом, разъясняя сложные моменты в тексте, следующем за примером. Если вы внимательно прочитаете все пояснения к примерам (не пугайтесь, они короткие!), то к концу этой главы приобретете практические знания в использовании большинства рас пространенных Perl-конструкций.
Массив и строковые литералы
В этом примере обратите внимание, прежде всего, на то, что набор круглых ско бок (...) создает список литералов. Отдельными элементами этого списка являются строки (которые разделяются запятыми). Созданный список присваивается перемен ной @items.
В языке Perl нет жесткого требования заключать все строки в кавычки. В конкретном случае начальное присваивание значения переменной @items с тем же успехом работает и без кавычек.
В языке Perl нет жесткого требования заключать все строки в кавычки. В конкретном случае начальное присваивание значения переменной @items с тем же успехом работает и без кавычек.
@iterns = (носки, туфли, шорты);
Такие строки без кавычек называются в Perl “голыми словами” (barewords), и они интерпретируются таковыми в качестве “последнего средства”. Это значит, что, если для некоторого объекта невозможно найти смысловую нагрузку, Perl пытается интерпрети ровать его как строку. В некоторых случаях это имеет смысл, если сохранится читабель ность кода. Однако наш пример не относится к таким случаям. Даже если вы сами пред-
98Часть I. Основы администрирования
почитаете всегда заключать строки в кавычки, будьте готовы к тому, что вам придется “разгадывать” намерения других программистов, разбираясь в их “голословном” коде.
В Perl существует еще один способ инициализировать этот массив. Он состоит в ис пользовании оператора qw (quote words — т.е. брать слова в кавычки). Это, по сути, фор ма заключения строки в кавычки, которая предоставляет вам право самим выбирать раз делители (как и во многих других случаях использования кавычек в Perl). Форма
@items = qw (носки туфли шорты);
является самой традиционной, но при этом может ввести в заблуждение, поскольку часть после оператора qw — уже не список. В действительности это строка, разделенная пробельными символами для формирования списка. Версия
@items = qw [носки туфли шорты];
тоже работает и, пожалуй, точнее передает смысл происходящего. Обратите внимание на то, что запятых здесь нет, поскольку их нагрузку “взял на себя” оператор qw.
Вызовы функций
Оба варианта — print и printf — принимают произвольное количество аргумен тов, которые разделяются запятыми. Но вот вы видите join(...). Не напоминает ли вам это вызов функции? Чем же “этот join” отличается от print и printf?
По сути, ничем, print, printf и join — это обычные функции. Perl позволяет опу скать круглые скобки в вызовах функций, если эта “экономия” не послужит причиной неоднозначности, поэтому обе формы приемлемы. В приведенной выше print-строке форма записи со скобками (join (...)) используется для явного отделения аргументов, передаваемых функции join, от аргументов, передаваемых функции print.
Выражение @items[0,1] должно дать “списочный” результат, поскольку оно на чинается с символа В действительности это выражение означает “кусочек масси
ва” (или подмассив), а список индексов 0,1 перечисляет индексы элементов исходного массива, которые должны быть включены в упомянутый “кусочек”. Здесь Perl прини мает диапазон значений, как и в эквивалентном выражении @items [0..1]. Здесь так же было бы допустимо использовать одиночный числовой индекс: например, выраже ние @items[0] означало бы список, содержащий один скаляр, т.е. строку “носки”, что в данном случае было бы эквивалентно литералу ("носки").
Массивы в вызовах функций автоматически раскрываются, поэтому в выражении
По сути, ничем, print, printf и join — это обычные функции. Perl позволяет опу скать круглые скобки в вызовах функций, если эта “экономия” не послужит причиной неоднозначности, поэтому обе формы приемлемы. В приведенной выше print-строке форма записи со скобками (join (...)) используется для явного отделения аргументов, передаваемых функции join, от аргументов, передаваемых функции print.
Выражение @items[0,1] должно дать “списочный” результат, поскольку оно на чинается с символа В действительности это выражение означает “кусочек масси
ва” (или подмассив), а список индексов 0,1 перечисляет индексы элементов исходного массива, которые должны быть включены в упомянутый “кусочек”. Здесь Perl прини мает диапазон значений, как и в эквивалентном выражении @items [0..1]. Здесь так же было бы допустимо использовать одиночный числовой индекс: например, выраже ние @items[0] означало бы список, содержащий один скаляр, т.е. строку “носки”, что в данном случае было бы эквивалентно литералу ("носки").
Массивы в вызовах функций автоматически раскрываются, поэтому в выражении
join(" и ", @items[0,l])
функция join получает три строковых аргумента: " и ", "носки" и "туфли". Она конкатенирует свой второй и последующие аргументы, вставляя между каждой парой копию первого аргумента. В результате получаем “носки и туфли”.
Преобразования типов в выражениях
В printf-строке при вычислении выражения $#items + 1 получим число 3. По определению выражение $#items содержит числовое значение, но это не дает основа ния считать, что выражение $#items + 1 предполагает выполнение арифметического действия; смешанный вариант "2" + 1 работает так же. “Магия” кроется в операто ре “+”, который всегда подразумевает арифметику, т.е. он преобразует свои аргументы в числа и генерирует числовой результат. Аналогично ему оператор “точка” (.), назна чение которого — конкатенировать строки, преобразует свои операнды “по контексту”, т.е. при вычислении выражения "2" . (12 ** 2) получим в результате “2144”.
Источник: Unix и Linux: руководство системного администратора | Немет Эви, Снайдер Гарт 5-е издание
Источник: Unix и Linux: руководство системного администратора | Немет Эви, Снайдер Гарт 5-е издание