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

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

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

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

Добавлен: 20.10.2018

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

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

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

thursday”,”freday”,”saturday”,”sunday”);

print(“Какой по счету сегодня день недели?”);

$day = <STDIN>;

chop $day;

print (“Today is a ”, @week[$day]);

Помимо операторов цикла while или until можно использовать другую полезную технику на основе оператора do с проверкой условия в конце цикла.

#!/usr/local/bin/perl

do

{

"Password? "; # Спрашивается пароль

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

chop $a; # Убирается символ newline

}

while ($a ne "fred")

# Выполнять до тех пор пока неверный пароль

Контрольное задание

1. Перепишите программу Hello world таким образом, чтобы в переменной a был записан печатаемый текст, а в переменной b - управляющий символ перехода на новую строку. Используйте двойные кавычки, но не используйте оператор конкатенации.

2. Выполнить любое задание по условным операторам, использующим if/elsif /else, из лабораторной работы 4, используя язык Perl.

3. Проверьте каждый из изученных способов печати на созданном Вами массиве.

4. Создайте небольшой массив и отсортируйте его элементы в прямом и обратном порядке.

5. Структура until в Perl похожа на структуру until в C. Перепишите программу, использующую оператор while, применяя until. Выполнение блока повторять до тех пор, пока выражение не станет верно, в while использовалась проверка на неравенство.

6. Посчитать значение факториала числа 8.

7. Модифицируйте программу раздела о поддержке файлов так, чтобы она печатала в конце каждой строки символ@.

8. Составьте свои программы на основе следующих примеров-фрагментов сценариев(sub - подпрограмма):

Пример 1. Определение и вызов процедуры.

sub marine {

$n += 1; #Глобальная переменная $n

print “Hello, sailor number $n!\n”;

}

&marine; # содержит сообщение Hello, sailor number 1!

&marine; # содержит сообщение Hello, sailor number 2!

&marine; # содержит сообщение Hello, sailor number 3!

&marine; # содержит сообщение Hello, sailor number 4!


Пример 2. Программа, использующая подпрограмму сложения двух переменных.

sub sum_of_fred_and_barney {

print “Вы вызвали процедуру sum_of_fred_and_barney!\n”;

$fred + $barney; #Возвращаемое значение

}

$fred = 3;

$barney = 4;

$c = &sum_of_fred_and_barney; # $c получает 7

print “\$c равно $c.\n”;

$d = 3 * &sum_of_fred_and_barney; #$d получает 21

print “\$d равно $d.\n”;


Пример 3. «Последнее вычисляемое значение»


sub larger_of_fred_and_barney {

if ($fred > $barney) {

$fred;

} else {

$barney;

}

}

$fred = 3;

$barney = 4;

$c = &larger_of_fred_and_barney; # $c получает 4

print “\$c равно $c.\n”;


Пример 4. Формирование интервала чисел.


sub list_of_fred_and_barney {

if ($fred < $barney) {

# Формирует интервал чисел от $fred до $barney (по возрастанию)

$fred..$barney;

} else {

# Формирует интервал чисел от $fred до $barney (по убыванию)

reverse $barney..$fred;

}

}

$fred = 11;

$barney = 6;

@c = &list_of_fred_and_barney;

# Массив @c получает значения 11, 10, 9, 8, 7, 6



Пример 5. Работа с аргументами.


sub max {

if ($_[0] > $_[1]) {

$_[0];

} else {

$_[1];

}

}

$c = &max(10, 15); # Запишет 15

$d = &max(5, 4, 10);

# Проигнорирует третий параметр и запишет 5




Пример 6. Усовершенствованная процедура &max.


$maximum = &max(3, 5, 10, 4, 6);

sub max {

my($max_so_far) = shift @_;

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

#значение первого параметра и удаляем его из массива

foreach (@_) {

If ($_ > $max_so_far) {

$max_so_far = $_;

}

}

$max_so_far;

}


Пример 7. Рекурсивная процедура просмотра дерева каталогов.



sub tree {

local (*ROOT);

my ($root)=$_[01;

opendir ROOT, $root;

my (@filelist) = readdir ROOT;

closedir ROOT;

for $x (gfilelist) {

if ($x ne "." and $x ne ".."){

$x=$root."/".$x;

print " $x\n" if (-f $x);

if (-d $x) {

print "$x:\n";

tree($x);

}

}

}

}

Пример 8. Нахождение наименьшего общего кратного НОК и наибольшего общего делителя НОД двух чисел.


sub nod {

my($tmp);

$tmp = $_[1] % $_[0];

if ($_[0] != 0) {

nod($tmp, $_[0]);

} else {

$_[1];

}

}

sub nok {

my($tmp) = nod($_[0], $_[1]);

$_[1] * ($_[0]- $_[0] % $tmp) / $tmp;

}

$a = $ARGV[0];

$b = $ARGV[1];

$c = nod($a, $b);

$d = nok($a, $b);

print “НОК $a и $b = $d, а НОД $a и $b = $c”;


Пример 9. Секретный код.


my $secret = int(1 + rand 100);

# “секретным считается число $secret.\n”;

while (1) {

print “Пожалуйста, введите число из диапазона от 1 до 100: ”;

chomp(my $guess = <STDIN>);

if ($guess =~ /quit|exit|^\s*$/i) {

print “Вы сдались. Секретным числом было $secret.\n”;

last;

} elsif ($guess < $secret) {

print “Слишком малое. Попробуйте еще раз!\n”;

} elsif ($guess == $secret) {

print “Вы угадали!\n”;

last;

} else {

print “Слишком большое. Попробуйте еще раз!\n”;

}

}




Пример 10.


#!/usr/bin/perl

package Staff;

sub new {

my ($class, $data) = @_;

my $self = $data;

bless $self, $class;

return $self;

}

sub setdata {

my ($self,$data) = @_;

for $i (keys %$data) {

$self->{$i}=$data->{$i};

}

return $self;

}

sub showdata {

my $self = shift;

my @keys = @_ ? @_ : sort keys %$self;

fоreach $key (@keys) {

print "\t$key => $self->{$key}\n";

}

return $self;


Лабораторное задание и порядок выполнения работы

  1. Изучить материал, выполняя рекомендуемые примеры и задания.

  2. Выполнить контрольное задание, используя свои файлы и каталоги. Возможны добавления в сценарии.

  3. Кратко законспектировать материал по новым командам.

Оформить отчет и защитить работу.

Требования к отчету

Отчет должен содержать:

  1. Краткие сведения о работе.

  2. Описание команд и сценариев, выполненных в данной работе (с Вашими именами файлов и каталогов).

90