Анимация
JavaScript
|
Главная Библионтека 536 Глава 15 • Пользовательские интерфейсы Пример 15.3. checkuser #!/usr/bin/perl -w # checkuser - чтение и проверка пароля пользователя use Term::ReadKey: print "Enter your password: "; ReadMode noecho; Spassword = Readline 0; chomp $password; ReadMode normal; print "\n"; (Susername, $encrypted) = ( getpwuid $< )[0,1]; if (crypt($password, $encrypted) ne $encrypted) { die "You are not $username\n"; } else { print "Welcome, $username\n"; 0 Смотри также- Документация по модулю Term;:ReadKey с CPAN; man-страницы crypt(3) и passwd(5) вашей системы (если есть). Функции crypt и getpwuid описаны в perlfuncH). 15.11. Редактирование входных данных Проблема Вы хотите, чтобы пользователь мог отредактировать строку перед тем, как отсылать ее вам для чтения. Решение Воспользуйтесь стандартной библиотекой Term;:ReadLine в сочетании с модулем Term;:ReadLine::Gnu с CPAN: use Term::Readline; Sterm = Term::Readline->new("APR DESCRIPTION"); SOUT = $term->OUT .STDOUT; Sterffl->addhistory(Sfake line); Sline = $term->readline(PROMPT): print SOUT "Any program output\n"; Комментарий Программа из примера 15.4 работает как простейший командный интерпретатор. Она читает строку и передает ее для выполнения. Метод readline читает строку с терминала с поддержкой редактирования и вызова истории команд. Вводимая пользователем строка автоматически включается в историю команд. Пример 15.4. vbsh #!/usr/bin/perl -w # vbsh - очень плохой командный интерпретатор use strict; use Term;;ReadLine; use POSIX qw(;sys wait h); my $term = Term;;ReadLine->new("Simple Shell"); my $OUT = $term->OUT() .STDOUT; my $cmd; while (defined ($cmd = $term->readline($ ) )) { my @output = $cmd; my $exit value = $? » 8; my $signal num = $? & 127; my $dumped core = P 128; printf $OUT "Program terminated with status %d from signal %d%s\n", $exit value, $signal num, $dumped core " (core dumped)" ; ""; print @output; $term->addhistory($seed line); Чтобы занести в историю команд свою строку, воспользуйтесь методом addhistory: $term->addhistory($seed line); В историю нельзя заносить больше одной строки за раз. Удаление строк из истории команд выполняется методом remove history, которому передается индекс в списке истории: О соответствует первому (самому старому) элементу, 1 - второму и т. д. до самых последних строк. $term->remove history($line number); Для получения списка истории команд используется метод GetHistory: history = $term->GetHistory; > Смотри также- Документация по стандартным модулям Term::ReadLine и Term::ReadLine::Gnu с CPAN. 15.12. Управление экраном Проблема Вы хотите выделять символы повышенной интенсивностью, перехватывать нажатия специальных клавиш или выводить полноэкранные меню, но не желаете беспокоиться о том, на каком устройстве вывода работает пользователь. Решение Воспользуйтесь модулем Curses с CPAN, который использует библиотеку curses{3) вашей системы. Комментарий Библиотека curses обеспечивает простое, эффективное и аппаратно-независимое выполнение полноэкранных операций. С его помощью можно писать высокоуровневый код вывода данных на логическом экране по символам или по строкам. Чтобы результаты вывода появились на экране, вызовите функцию refresh. Вывод, сгенерированный библиотекой, описывает только изменения виртуального экрана с момента последнего вызова refresh. Это особенно существенно для медленных подключений. Работа с модулем Curses демонстрируется программой гер из примера 15.5. Вызовите ее с аргументами, описывающими командную строку запускаемой программы: % гер ps aux % rep netstat % rep -2 5 Ipq Сценарий rep в цикле вызывает команду и выводит ее данные на экран, обновляя лишь ту часть, которая изменилась с момента предыдущего запуска. Такой вариант наиболее эффективен при малых изменениях между запусками. В правом нижнем углу экрана выводится текущая дата в инвертированном изображении. По умолчанию гер ожидает 10 секунд перед повторным запуском команды. Чтобы изменить период задержки, передайте нужное количество секунд (допускается дробное число) в качестве аргумента, как это было сделано выше при вызове Ipq. Кроме того, нажатие любой клавиши во время ожидания приводит к немедленному выполнению команды. Пример 15.5. гер #!/usr/bin/perl -W # гер - циклическое выполнение команды use strict; use Curses; my $timeout = 10; If (laARGV && $ARGV[0] =~ /"-(Xd+X. ?\d)S/) { $timeout = $1; shift, 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 |