Анимация
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

19.7. Форматирование списков и таблиц средствами HTML 683

close(KID TO READ) or warn "kid exited %>";

} else { # Потомок

# Переконфигурировать, затем

exec($program, @options, laargs) or die "cant exec program: $!";

Безопасный конвейерный вызов open существует и для записи. Ненадежный вызов:

open(KID TO WRITE, "$program $options laargs"); О НЕНАДЕЖНО заменяется более сложным, но безопасным кодом: $pid = open(KID TO WRITE, "-"):

die "cannot fork: $!" unless defined($pid = open(KID TO WRITE, "-")); $SIG{ALRM} = sub { die "whoops, Sprogram pipe broke" };

If (Spid) { # Родитель

for (ladata) { print KID TO WRITE S }

close(KID TO WRITE) or warn "kid exited S";

> else { n Потомок

# Переконфигурировать, затем

exec($program, laoptions, laargs) or die "cant exec program: S";

Там, где комментарий гласит «Переконфигурировать», предпринимаются дополнительные меры безопасности. Вы находитесь в порожденном процессе, и вносимые изменения не распространяются на родителя. Можно изменить переменные окружения, сбросить временный идентификатор пользователя или группы, сменить каталог или маску umask и т. д.

Разумеется, все это не поможет в ситуации, когда вызов system запускает программу с другим идентификатором пользователя. Например, почтовая программа senJmai/является setuid-программой, часто запускаемой из сценариев CGI. Вы должны хорощо понимать риск, связанный с запуском sendmail или любой другой setuid-программы.

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

Описание функций system, exec и open вperlfunc{l);perkec{l); рецепты 16.1-16.3.

19.7. Форматирование списков и таблиц средствами HTML

Проблема

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



Решение

Модуль CGI содержит вспомогательные функции HTML, которые получают ссылку на массив и автоматически применяются к каждому элементу массива:

print о1( li([ qw(recl blue green)]) ); <OL><LI>red</LI> <LI>blue</LI> <LI>green</LI></OL> @names = qw(Larry Мое Curly); print ul( li({ -TYPE => "disc" }, \ianames) ); <UL><LI TYPE="dlsc">Larry</LI> <LI TYPE="disc">Moe</LI> <LI TYPE="dlsc">Curly</LI></UL>

Комментарий

Свойство дистрибутивности функций CGLpm, генерирующих HTML-код, заметно упрощает процесс генерации списков и таблиц. 11ри передаче простой строки эти функции просто выдают HTML-код для данной строки. Но при передаче ссылки на массив они применяются ко всем строкам.

print li("alpha");

<LI>alpha</LI> print li( [ "alpha", "omega"] );

<LI>alpha</LI> <LI>omega</LI>

Вспомогательные функции для списков загружаются при использовании тега : standard, но для получения вспомогательных функций для работы с таблицами придется явно запросить : html3. Кроме того, возникает конфликт между тегом <TR>, которому должна соответствовать функция tr(), и встроенным оператором Perl tr /. Следовательно, для построения строк таблицы следует использовать функцию Тг().

Следующий пример генерирует таблицу HTML по хэщу массивов. Ключи хэша содержат заголовки строк, а массивы значений - столбцы.

use CGI qw(-standard :html3); %hash = (

"Wisconsin" => [ "Superior", "Lake Geneva", "Madison" ], "Colorado" => [ "Denver", "Fort Collins", "Boulder" ], "Texas" => [ "Piano", "Austin", "Fort Stockton" ],

"California" => [ "Sebastopol", "Santa Rosa", "Berkeley" ],

$\ = "\n";

print "<TABLE> <CAPTION>Cities I Have Known</CAPTION>"; print Tr(th [qw(State Cities)]); for Sk (sort keys %hash) {

print Tr(th($k), td( [ sort ia{$hash{Sk}} ] ));

>

print "</TABLE>";

Генерируется следующий текст;



19.7. Форматирование списков и таблиц средствами HTML 685

<TABLE> <CAPTION>Cities I Have Known</CAPTION> <TR><TH>State</TH> <TH>Cities<AH></TR>

<TR><TH>California</TH> <Т0>Ввгкв1ву<Я0> <TD>Santa Rosa</TD>

<TD>Sebastopol</TD> <ЯВ> <TR><TH>Colorado</TH> <TD>Boulder<AD> <TD>Denver</TD>

<TD>Fort Collins</TD> </TR> <TR><TH>Texas</TH> <TD>Austin</TD> <TD>Fort Stockton</TD>

<TD>Plano</TD></TR> <TR><TH>Wisconsin</TH> <TD>Lake Geneva</TD> <TD>Madison</TD>

<TD>Superior</TD></TR>

</TABLE>

Те же результаты можно получить всего одной командой print, хотя это несколько сложнее, поскольку вам придется создавать неявный цикл с помощью тар. Следующая команда print выдает результат, идентичный приведенному выще:

print table

captionCCities I have Known), Tr(th [qw(State Cities)]),

map { Tr(th($ ), td( [ sort ia{$hash{$ }} ] )) } sort keys %hash;

Эти функции особенно удобны при форматировании результатов запроса к базе данных, как показано в примере 19.3 (см. главу 14 «Базы данных»).

Пример 19.3. salcheck

Ol/usr/bin/perl

О salcheck - проверка жалованья use DBI;

use CGI qw(:standard :html3);

$limit = paramCLIMIT");

print headerO, start html("Salary Query"), h1("Search"), start form(),

pCEnter minimum salary", textfield("LIMIT")),

submitO,

end form();

If (defined $limit) {

$dbh = DBI->connect("dbi:mysql:somedb:server.host.dom:3306",

"username", "password")

or die "Connecting: $DBI::errstr"; $sth = $dbh->prepare("SELECT name,salary FROM employees

WHERE salary > $limit")

or die "Preparing: ", $dbh->errstr; $sth->execute

or die "Executing: ", $sth->errstr;

print h1("Results"), "<TABLE BQRDER=1>";



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