Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 [ 169 ] 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

ременной $opt D. Параметры, анализируемые с помощью getopt, не являются логическими (то есть имеют конкретное значение).

Модуль Getopt:;Std также содержит функцию getopts, которая позволяет указать, является ли параметр логическим или принимает значение. Параметры со значениями (такие, как параметр -о программы gcc) обозначаются двоеточием, как это сделано в следующем фрагменте:

use Getopt::Std; getoptsCo:"), if ($opt o) {

print "Writing output to $opt o";

Обе функции, getopt и getopts, могут получать второй аргумент - ссылку на хэш. При наличии второго аргумента значения вместо переменных $opt X сохраняются в $hash{X}:

use Getopt::Std;

%option = (); getopts("Do:", \%option);

If ($option{D}) {

print "Debugging mode enabled.\n";

# Если параметр -о не задан, направить результаты в -". » Открытие "-" для записи означает STDOUT $option{o} = "-" unless defined $option{o};

print "Writing output to file $option{o}\n" unless $option{o} eq "-"; open(STDOUT, "> $option{o}")

or die "Cant open $option{o} for output- $!\n";

Некоторые параметры программы могут задаваться целыми словами вместо отдельных символов. Обычно они имеют специальный префикс - двойной дефис:

% gnutar --extract --file latest.tar

Значение параметра -file также может быть задано с помощью знака равенства: % gnutar --extract --file=latest.tar

Функция GetOptions модуля Getopt::Long анализирует эту категорию параметров. Она получает хэш, ключи которого определяют параметры, а значения представляют собой ссылки на скалярные переменные:

use Getopt::Long;

GetOptions( "extract" => \$extract, "file=s" => \$file );

If (Sextract) {

print "Im extracting.\n";



15.2. Проверка интерактивного режима 525

die "I wish I had a file" unless defined $file; print "Working on the file $file\n";

Если ключ хэша содержит имя параметра, этот параметр является логическим. Соответствующей переменной присваивается false, если параметр не задан, или 1 в противном случае. Getopt::Long не ограничивается логическими параметрами и значениями Getopt::Std. Возможны следующие описания параметров:

Описание Значение Комментарий

option

Задается в виде -option или не задается вообще

option!

Может задаваться в виде --option или -nooption

option=s

Обязательный строковый параметр: -option=somestring

option:s

Необязательный строковый параметр: -option или --option=somestring

option=i

Обязательный целый параметр: -option=35

option:i

Необязательный целый параметр: -option или -option=35

option=f

Обязательный вещественный параметр: -option=3.141

option:f

Необязательный вещественный параметр: -option или -option=3.141

!> Смотри также-

Документация по стандартным модулям getopt::Long и Getopt::Std; примеры ручного анализа аргументов встречаются в рецептах 1.5, 1.17, 6.22, 7.7, 8.19 и 15.12.

15.2. Проверка интерактивного режима

Проблема

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

Решение

Воспользуйтесь оператором -t для проверки STOIN и STDOUT:

sub I arn interactive {

return -t STDIN && -t STDOUT;

В POSIX-совместимых системах проверяются группы процессов:

use POSIX qw/getpgrp tcgetpgrp/;

sub I am interactive {

local .TTY; # local file handle

open(TTY, "/dev/tty") or die "cant open /dev/tty; $!"; my Stpgrp = tcgetpgrp(fileno(TTY)); my Spgrp = getpgrpO;



close TTY,

return ($tpgrp == $pgrp),

Комментарий

Оператор -t сообщает, соответствует ли файловый манипулятор или файл терминальному устройству (tty); такие устройства являются признаком интерактивного использования. Проверка сообщит лишь о том, была ли ваша программа перенаправлена. Если программа запущена из командного интерпретатора, при перенаправлении STDIN и STDOUT первая версия I am interactive возвращает false. При запуске из сгоп I ani interactive также возвращает false.

Второй вариант проверки сообщает, находится ли терминал в монопольном распоряжении программы. Программа, чей ввод и вывод был перенаправлен, все равно при желании может управлять своим терминалом, поэтому POSIX-версия I ani interactive возвращает true. Профамма, запущенная из сгоп, не имеет собственного терминала, поэтому I ani interactive возвратит false.

Какой бы вариант I ani interactive вы ни выбрали, он используется следующим образом;

while (1) {

if (I am interactive()) { print Prompt

Sline = <STDIN>,

last unless defined $line,

# Обработать $line

Или более наглядно:

sub prompt { print Prompt if I am interactive() } for (promptO Sline = <STDIN>, prompt()) {

# Обработать $line

!> Смотри также-

Документация по стандартному модулю POSIX. Оператор проверки файлов -t описан врег1ор{\).

15.3. Очистка экрана

Проблема

Требуется очистить экран.

Решение

Воспользуйтесь модулем Term;:Cap для посылки нужной последовательности символов. Скорость вывода терминала можно определить с помощью модуля



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 [ 169 ] 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242