Изучаем Perl


Глава 14 "Управление процессами"



Глава 14 "Управление процессами"

1. Вот один из способов решения этой задачи:

if ('date' =~ /"S/) (

print "Go play!\n";

} else (

print "Get to work!\n";

}

Оказывается, команда date выводит букву s в качестве первого символа только по выходным (Sat или sun), что делает задачу тривиальной. Мы вызываем date, затем с помощью регулярного выражения смотрим, является ли первый символ буквой s. На основании результата мы выводим одно сообщение или другое.

2. Вот один из способов решения этой задачи:

open(PW,"/etc/passwd") ;

while (<PW>) {

chomp;

($user,$gcos) = (split /:/)[0,4];

($real) = split (/,/, $gcos); '

$real($user) = $real;

)• close(PW);

open(WHO,"who I") || die "cannot open who pipe";

while (<WHO>) (

($login, $rest) =/" (\S+) \s+(.*)/;

$login = $real($login) if $real($login);

printf "%-30s ts\n",$login,$rest;

}

В первом цикле создается хеш %real, ключи которого — регистрационные имена, а значения — соответствующие реальные имена. Этот хеш используется в следующем цикле для замены регистрационного имени на реальное.

Во втором цикле осуществляется просмотр результата выполнения команды who, которая вызвана при помощи дескриптора файла. Каждая строка полученного в результате выражения разбивается путем сопоставления с регулярным выражением в списочном контексте. Первое слово строки (регистрационное имя) заменяется реальным именем из хеша, но только если оно существует. После всего этого с помощью функции printf результат помещается в stdout.

Операции открытия дескриптора файла и начала цикла можно заменить строкой

foreach $_ ('who') (

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

3. Вот один из способов решения этой задачи:

open(PW,"/etc/passwd");

while (<PW>) (

chomp;

($user,$gcos) = (split /:/)[0,4];

($real) = split(/,/, $gcos);

$real($user} •= $real;

} close(PW) ;

open(LPR,"1Ipr") I I die "cannot open LPR pipe";

open (WHO,"who]") || die "cannot open who pipe";

while (<WHO>) {

# или заменить предыдущие две строки на foreach $_ ('who') (

($login, $rest) = /л (\S+) \s+(.*)/;

$login = $real($loginl if $real($login} ;

printf LPR "%-30s %s\n",$login,$rest;

}

Разница между этой программой и программой из предыдущего упражнения состоит в том, что мы добавили дескриптор файла lpr, открытый для процесса Ipr, и модифицировали оператор printf так, чтобы он посылал данные не в stdout, а в этот дескриптор.

4. Вот один из способов решения этой задачи:

sub mkdir f

'system "/bin/mkdir", @_;

}

Здесь команда mkdir получает аргументы прямо из аргументов подпрограммы. Однако возвращаемое значение должно подвергнуться операции логического отрицания, потому что ненулевой код выхода из system должен быть преобразован в значение "ложь" для вызывающей Perl-программы.

5. Вот один из способов решения этой задачи:

sub mkdir (

my($dir, $mode) = 8_;

('system "/bin/mkdir", $dir) && chmod($mode, $dir) ;

1

Сначала мы описываем локальные аргументы этой подпрограммы — $dir и $ mode. Затем мы вызываем mkdir для каталога с именем $dir. В случае успеха операция chmod присваивает этому каталогу соответствующие права доступа.









Начало  Назад  Вперед