На этом шаге мы рассмотрим использование командной строки для решения некоторых задач.
Одной из наиболее часто встречающихся задач системного администрирования является задача обработки содержимого большого числа файлов и данных (например, изменение значений некоторых переменных среды в конфигурационных файлах). Можно написать сценарий Perl, в цикле обрабатывающий строки переданных ему файлов, а можно воспользоваться опциями -n или -p, которые организуют цикл по файлам, и задать необходимые действия для каждой строки файла в опции -e. Таким образом, быстрота решения задачи гарантирована!
Итак, мы хотим в конфигурационных файлах config1, config2 и config3, содержащих строки вида КЛЮЧ = ЗНАЧЕНИЕ, изменить значение ключа "Key1" на величину 5. Эта задача решается следующим вызовом perl из командной строки:
perl -p -i.bak -e"m/(\w+)\s*=\s*(.+)/i; if($l eq \"Key\"){$_ = \"$1 = 5\n\";};" config1 config2 config3
Несколько комментариев к строке вызова интерпретатора perl. В ней использованы опции -р и -i для обработки содержимого конфигурационных файлов по месту (опция -i, причем задано расширение .bak для копий исходных файлов) в неявном цикле с печатью (опция -р). Код модификации содержимого файлов задается с помощью опции -е. Он достаточно прост. Строка файла, прочитанная в специальную переменную Perl $_, проверяется на содержание подстроки вида КЛЮЧ = ЗНАЧЕНИЕ. В регулярном выражении определены две группы: первая соответствует ключу, а вторая - его значению. Таким способом мы сохраняем имя ключа и его значение в специальных переменных $1 и $2 соответственно. Второй оператор кода, в случае совпадения имени ключа с заданным, заносит в переменную $_ строку с новым значением ключа (Key1 = 5).
Как выполняется этот сценарий? Создается копия исходного конфигурационного файла config1 (файл config1.bak) и новый пустой файл с именем config1. Последовательно в переменную $_ читаются строки из файла-копии, а в переменную $1 заносится имя ключа, если таковой обнаружен оператором m/.../. Если имя ключа равно "Key1", то в переменной $_ формируется строка задания нового значения ключа. Перед чтением следующей строки файла config1.bak в файл config1 записывается содержимое переменной $_. Эта процедура выполняется со всеми заданными конфигурационными файлами. В результате выполнения этой программы формируются конфигурационные файлы, в которых значение ключа Key1 изменено на 5.
Опция -р достаточна полезна для анализа содержимого файлов. Например, следующая команда отобразит на экране содержимое файла prog.pl:
perl -p -е"1" prog.pl
При работе с интерпретатором из командной строки очень часто используются регулярные выражения для отображения какой-либо части содержимого файла. Следующий вызов perl отображает на экране монитора последний столбец данных из файла test.dat (элементы столбцов в строке файла разделены пробелами):
perl -p -e "s/\s*.+\s(.+)\s*/$l\n/;" test.dat
Со следующего шага мы начнем знкомиться с CGI-программированием на языке Perl.