Шаг 148.
Опции командной строки (окончание)

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

    Одной из наиболее часто встречающихся задач системного администрирования является задача обработки содержимого большого числа файлов и данных (например, изменение значений некоторых переменных среды в конфигурационных файлах). Можно написать сценарий 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 при работе с интерпретатором perl является необходимым действием. Его можно задать, указав имя файла программы после всех опций, либо непосредственно в командной строке в опции . При печати содержимого файла мы задали в командной строке программу из одного оператора, который, по существу, ничего не делает.

    При работе с интерпретатором из командной строки очень часто используются регулярные выражения для отображения какой-либо части содержимого файла. Следующий вызов perl отображает на экране монитора последний столбец данных из файла test.dat (элементы столбцов в строке файла разделены пробелами):

  perl -p -e "s/\s*.+\s(.+)\s*/$l\n/;" test.dat


    Замечание. При использовании опции следует помнить, что она печатает содержимое специальной переменной $_. Поэтому информацию, подлежащую отображению, следует помещать именно в эту переменную, как в последнем примере.

    Со следующего шага мы начнем знкомиться с CGI-программированием на языке Perl.




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