Файл: Лабораторная Linux №5.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Операционные системы

Добавлен: 20.10.2018

Просмотров: 992

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лабораторная работа № 5

Сценарии языка Perl

Цель работы: изучение языка Perl для построения сценариев, используемых в командном интерпретаторе BASH ОС Linux и в сценариях гипертекстовых страниц.

Продолжительность работы ‑ 4 ч.


Основы создания Perl-программы

Practical Extraction and Report Language, сокращенно называемый Perl, представляет собой интерпретируемый язык, предназначенный для написания сценариев. Он реализован в виде ядра, к которому удобно добавлять новые функции. В настоящее время с помощью Perl можно проверять сетевые соединения, контролировать взаимодействие между процессами, управлять базами данных, выполнять команды системного администрирования, использовать для создания сценариев на web-узлах.

Любой оператор языка Perl может быть вызван из командной строки, например, оператор print с его данными:

$ print "Hello word":

$ perl -e 'print "Hello word.";'

В этом случае используется команда perl с опцией -e, текст оператора заключается в одинарные кавычки.

Более длинный сценарий Perl можно также записывать в одинарных кавычках, но удобнее оформлять отдельным файлом. Файлы, содержащие команды Perl, должны иметь расширение .pl. Простейшая программа, написанная на языке Perl и запомненная с расширением .pl, может выглядеть таким образом:

#!/usr/local/bin/perl

# программа, выводящая на печать текст

print 'Hello world.'; # Печать текста

Каждая Perl-программа начинается с первой строки, прописывающей путь к команде perl, но может быть другой путь в конкретной системе. Первая строка начинается со знаков #!:

#!/usr/local/bin/perl

Прежде чем начать писать сценарии на языке Perl, посмотрите, в каком каталоге Вашей файловой системы он находится. Возможно, это /usr/bin/perl.

Далее следует стандартный комментарий, используемый в любых shell-сценариях и вставляемый в программу через символ #. Программа не реагирует на строки с символом # за исключением первой строки. Если комментарий располагается на нескольких строках, то в нaчале каждой строки должен быть поставлен символ #. Каждый оператор Perl должен заканчиваться точкой с запятой.

Функция print выводит некоторую информацию. В примере, приведенном выше, она печатает последовательность символов Hello world. И конечно, строка закачивается знаком точка с запятой.

Запуск программы

Чтобы подготовить текст программы, можно использовать любой текстовый редактор. Удобным является редактор Emacs. После того как текст программы подготовлен и запомнен в файл (с расширением .pl), задайть этому файлу право на выполнение, используя команду установки полномочий, аналогично тому, как это делалось для shell-сценариев:

$ chmod u+x progname

Далее запустите программу на выполнение в среде Perl:

$ perl progname

$ ./progname

$ progname

Весь сценарий Perl проверяется перед выполнением программы, сведения об ошибках выдаются на экран с указанием соответствующих номеров строк. Но иногда сообщения недостаточно четки или вообще отсутствуют. Поэтому лучше выполнять программу Perl с опцией указания замечаний:


$ perl -w progname

На экране будут отображаться замечания и другие полезные сообщения до выполнения программы.

Язык Perl синтаксически больше похож на язык С++, чем на shell-сценарии. В Perl в конце строки, как и в С++, используется знак точки с запятой, также схоже большинство управляющих символов. Например, одинаково обозначаются символ перехода на новую строку \n и символ табуляции \t. Но, в отличие от С++, в языке-интерпретаторе Perl в управляющих структурах не допускается применение одинарных операторов. Набор операторов должен быть заключен в фигурные скобки { }.

Чтобы запустить программу с отладчиком, следует использовать команду perl с опцией -d:

$ perl -d progname

После выполнения первой компиляции, вносятся необходимые исправления, и выполняется следующая компиляция. Так делается до тех пор пока все ошибки не будут исправлены. Если ошибок нет в очередной, может быть первой, версии компиляции, то после короткой паузы на компиляцию программа выполняется довольно быстро.

Скалярные переменные

Скалярные переменные - основные переменные в Perl (scalar variable). Они поддерживают оба типа переменных - строковые и числовые. Признаком переменной в программе является знак $ перед ее именем. Тип переменной зависит от ее использования. Переменные не объявляются. Если переменные используются в арифметических выражениях или им присваиваются числовые значения, то среда Perl считает эти переменные числовыми. Все остальные переменные считаются строковыми.

Пример 1. Установить значение переменной $priority равным 9:

$priority = 9;

Пример 2. Perl поддерживает числа как строковые переменные, они должны быть помещены в одинарные кавычки:

$priority = '9';

Пример 3. Строковые переменные могут быть записаны как последовательность символов, взятых в одинарные кавычки, например:

$priority = 'high';

или:

$default = '0009';

Perl также использует специальные переменные среды, которые могут состоять из знака подчеркивания, букв, чисел, но не начинающихся с чисел. Также в Perl различаются прописные и строчные символы в переменных. Так, переменная $a и переменная $A являются различными.

Присваивания и операции

Perl использует все обычные арифметические операторы языка C:

$a = 1 + 2; # Добавить 1 к 2 и сохранить в $a

$a = 3 - 4; # Вычесть 4 из 3 и сохранить в $a

$a = 5 * 6; # Умножение 5 на 6

$a = 7 / 8; # Деление 7 на 8 дает 0.875

$a = 9 ** 10; # Возведение 9 в десятую степень

$a = 5 % 2; # Остаток от деления 5-ти на 2

++$a; # Инкремент $a и помещение результата в $a

$a++; # Помещение значения в переменную $a и увеличение $a на 1

--$a; # Уменьшение $a и помещение результата в $a

$a--; # Помещение в $a и уменьшение $a на 1

Для строковых переменных Perl использует следующие операции:

$a = $b . $c; # Конкатенация $b и

$a = $b x $c; # Повторение строки $b указанное в $c число раз (строка может состоять из одного символа)

При присвоении Perl использует:

$a = $b; # присвоение $b переменной $a

$a += $b; # Добавляет $b к $a


$a -= $b; # Вычитает $b из $a

$a .= $b; # Присоединяет $b к $a

Заметим, что когда Perl присваивает величину $b переменной $a: $a = $b, то он делает копию $b и после этого выполняет присвоение в $a. Если через некоторое время изменится значение переменной $b, то оно не станет значением переменной $a.

Используя команду:

$ man perlop

Вы можете получить подробную информацию о команде Perl.

Пример 1. Печать apples и pears с использованием конкатенации:

$a = 'apples';

$b = 'pears';

$ print $a 'и' $b'

печатает $a' и '$b;

Пример 2. Если записать команду:

$ print '$a и $b';

то печатается посимвольно текст $a и $b.


Пример 3. Если использовать двойные кавычки вместо одинарных, то напечатается как в первом примере:

$ print "$a и $b";

Дело в том, что двойные кавычки дают возможность интерполировать информацию в них, включая переменные.

Условия

Perl поддерживает управляющие структуры ‑ if/then/else состояния и операции сравнения. Пример условной управляющей структуры if/else:

if ($a)

{

print "The string is not empty\n";

}

else

{

print "The string is empty\n";

}

Пустая строковая переменная рассматривается как ошибка.

Пример условной управляющей структуры if/elsif /else:

if (!$a) # The ! is the not operator

{

print "The string is empty\n";

}

elsif (length($a) == 1) # If above fails, try this

{

print "The string has one character\n";

}

elsif (length($a) == 2) # If that fails, try this

{

print "The string has two characters\n";

}

else # Now, everything has failed

{

print "The string has lots of characters\n";

}



Переменные массивов

В Perl используется еще один вид переменных - переменные массивов (array variable), представляющие список скалярных переменных. Переменной, обозначающей массив, присваивается список значений. Массивы помечаются символом @ перед именем массива:

food = ("apples", "pears", "eels");

@music = ("whistle", "flute");

Переменная @food, переменная @music состоит из 2-х элементов. К элементам массива можно обращаться по отдельности, нумерация начинается с 0.

К элементам массива можно обращаться по индексу, заключенному в квадратные скобки, например, обращение ко второму элементу массива @food:

$food[2]

Присвоения в массиве

Сформируем новый массив двумя способами, используя предыдущий @music = ("whistle", "flute"); и новые элементы. Следующие два выражения являются эквивалентными:

@moremusic = ("organ", @music, "harp");

@moremusic = ("organ", "whistle", "flute", "harp");

Для обработки массивов используются различные функции и свойства массивов.

1. Функция push предназначена для добавления новых элементов в конец массива. Простейший путь добавить элемент в массив следующий:

push(массив, список значений);

Например, eggs добавляется в конец массива @food:

push(@food, "eggs");

Чтобы добавить два или более элементов в массив используется один из следующих способов:

push(@food, "eggs", "lard");

push(@food, ("eggs", "lard"));

push(@food, @morefood);

Функция push возвращает длину нового списка.


2. Функция pop используется для удаления последнего элемента массива:

pop(массив);

Например, функция pop из начального списка возвращает eels и теперь @food имеет два элемента массива @food:

push(@food, "eels");

$grub = pop(@food); # Теперь $grub = "eels"

3. Функция shift добавляет элемент в начало массива:


shift (массив, список значений);

4. Функция unshift удаляет элемент из начала массива:

unshift (массив);

5. Сортировка элементов массива в прямом и обратном порядке выполняется функциями соответственно sort(массив) reverse(массив).

6. Запись длины массива в скалярную переменную.

Строка $f = @food; выдает длину @food, но следует заметить, что $f ="@food"; возвращает список строковых данных с пробелами между каждыми элементами. Пробелы могут быть удалены изменением специальной строковой переменной $. Это одна из многочисленных специальных переменных Perl. Элементы массивов можно присваивать скалярным переменным:

($a, $b) = ($c, $d); # То же самое, что и $a=$c; $b=$d;

($a, $b) = @food;

# $a и $b являются первым и вторым элементами @food.

($a, @somefood) = @food;

# $a первый элемент массива @food,

# @somefood список остальных элементов массива.

# (@somefood, $a) = @food;

# @somefood это @food и $a неопределен.

7. Определение текущего числа элементов массива с использованием специальной переменной, обозначаемой таким образом: $#имя_массива, соответствующей индексу последнего элемента списка. Элементы массива имеют разный тип: строковый, числовой, строковый.

Чтобы определить текущее число элементов массива @food используется следующее выражение $#food, чтобы вывести на экран количество элементов массива используется команда:

$ print "$#food"

print @food; # Просмотр самого массива

print "@food"; # текущее количество элементов массива

$ @food = ("pure", 12, 3.1415, " fresh bunchings") | print @food;

Поддержка файлов

Perl поддерживает работу с файлами. Здесь рассмотрены основные операторы для работы с файлами, приведены примеры.

Пример простой программы в Perl, использующей файлы. Эта программа используется в ОС Linux и ОС UNIX как команда cat при чтении из входного потока и выводе на стандартный вывод (экран).

#!/usr/local/bin/perl

# Программа открывает файл пароля, читает из него,

# печатает его и закрывает его снова.

$file = '/etc/passwd';

# имя файла, содержащееся в переменной

open(INFO, $file);

# Открытие файла $file с дескриптором INFO

@lines = <INFO>;

# чтение файла из дескриптора в массив

close(INFO); # Закрытие файла

print @lines; # Печать массива

Функция open открывает файл для чтения, первый параметр называется дескриптором файла (filehandle), он позволяет Perl ссылаться на файл в будущем. Второй параметр - переменная, в которой находится имя файла. Имя файла может быть указано явно, тогда используются двойные кавычки. Например, open(INFO, "file1"); следовательно, $file = "file1". Чтобы прочитать информацию из открытого файла, нужно указать его дескриптор между символами < >.

Функция close используется в Perl для завершения работы с файлом. Функция open использует следующие установки прав доступа к файлам:

open(INFO, $file);

# Открытие файла для чтения

open(INFO, ">$file");

# Открытие файла для записи

open(INFO, ">>$file");

# Открытие файла для добавления

#данных в конец файла

open(INFO, "<$file");

# Открытие файла для чтения

Если файл уже открыт для записи, то строковую информацию можно записать в него, используя дескриптор файла INFO, как показано в следующей записи: print INFO "This line goes to the file.\n";


Если используется стандартный ввод, который обычно производится с клавиатуры, и стандартный вывод (обычно экран), то записи осуществляются следующим образом соответственно:

open(INFO, '-'); # открыть стандартный ввод

open(INFO, '>-'); # открыть стандартный вывод

В вышеописанной программе информация читается из файла INFO.

В описании @lines = <INFO>; файл представлен дескриптором файла, заданным в угловых скобках, в массиве @lines. Выражение <INFO> читает переменную в файл за один шаг, т.к. чтение осуществляется в контексте переменной массива. Если переменную @lines заменить скалярной переменной $lines, тогда только одна следующая строка будет прочитана в файл. В обоих случаях каждая строка полностью сохраняется с признаком конца строки в конце.

Циклические структуры

Язык Perl использует следующие циклические структуры: foreach, for, while, do-while и until.

foreach

Структура foreach используется для обработки списков и массивов, последовательно просматриваются аргументы foreach, следующие за этой функцией после переменной и выделенные скобками:

foreach $morsel (@food) # обращается к каждому элементу

# и записывает в переменную $morsel

{

print "$morsel\n"; # Печать элементов массива

print "ОК\n"; # ОК

}

Действия, выполняемые в фигурных скобках, повторяются каждый цикл. Переменной $morsel последовательно присваиваются значения элементов массива @food до тех пор, пока есть элементы.

Операторы сравнения

$a == $b # $a равно $b (числовое сравнение)?

$a != $b # $a не равно $b(числовое сравнение)?

$a eq $b # $a равно $b (строковое сравнение)?

$a ne $b # $a не равно $b (строковое сравнение)?

Можно использовать логическое and, or и not:

($a && $b) # $a и $b верно?

($a || $b) # Хотя бы одно из $a и $b верно?

!($a) # $a неверно?

Цикл for

Структура цикла for в Perl похожа на структуру for в C. Ее вид следующий:

for (initialise; test; inc)

{

first_action;

second_action;

etc

}

В первой строке сначала выполняется инициализация переменных (initialise), выполняется сравнение (test), далее увеличение значения переменной на 1 (inc).

Пример печани чисел от 0 до 9.

for ($i = 0; $i < 10; ++$i) # Start with $i = 1

# Выполнять пока $i < 10

# увеличение $i на 1 до повторения

{

print "$i\n";

}

Операторы циклов while и until

Ниже представлена программа, иллюстрирующая чтение входной информации с клавиатуры (пароль) и продолжающейся до тех пор, пока не будет введен правильный пароль:

#!/usr/local/bin/perl

print "Password? "; # Пароль?

$a = <STDIN>; # Ввод пароля

chop $a;

# удалить последний символ переменной

while ($a ne "fred") # Пока ввод неправильный...

{

print "sorry. Again? "; # Спросить пароль снова

$a = <STDIN>; # Ввести пароль снова

chop $a; # Chop off newline again

}

Блок в фигурных скобках выполняется до тех пор пока не будет введен правильный пароль. Из стандартного ввода можно читать до открытия файла. Когда пароль введен в переменную $a, в ее конец добавляется символ начала новой строки. Функция chop удаляет последний символ переменной (имеет строковый тип).

#!/usr/local/bin/perl

@week = (“monday”,”tuesday”,”wednesday”,