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

716 Глава 20 • Автоматизация в Web Пример 20.6. surl

#!/usr/bin/perl -w

# surl - сортировка URL по времени последней модификации

use LWP::UserAgent; use HTTP::Request; use URI::URL qw(url);

iny($url, %Date):

my $ua = LWP::UserAgent->new();

while ( Surl = url(scalar <>) ) { my(Sreq, Sans);

next unless Surl->scheme =~ /"(filehttps?)S/;

Sans = Sua->request(HTTP::Request->new("HEAD", Surl));

if ($ans->is success) {

SDate{Surl} = Sans->last modified 11 0; # unknown } else {

print STDERR "Surl: Error [", Sans->code, "] ", $ans->message, "(Хп";

foreach Surl ( sort { SDatefSb} <=> SDatelSa} } keys %Date ) {

printf %-25s %s\n", SDate{Surl} (scalar localtime SDatelSurl})

: XNONE SPECIFIED>", Surl;

Комментарий

Сценарий surl больше похож на традиционную программу-фильтр. Он построчно читает URL из стандартного ввода (на самом деле данные читаются из <ARGV>, что но умолчанию совпадает с STDIN при пустом массиве (aARGV). Время последней модификации каждого URL извлекается с помощью запроса HEAD. Время сохраняется в хэше, где ключа.ми являются URL. Затем простейшая сортировка хэша по значению упорядочивает URL но времени. При выводе внутренний формат времени преобразуется в формат localtime.

В следующем примере программа хмг/ из предыдущего рецепта извлекает список URL, после чего выходные данные этой программы передаются на вход surl.

%xurl http: www.perl.com/ surl head

Mon Apr 20 06:16:02 1998 http; electricllchen.com/linux/srom.html

Fri Apr 17 13:38:51 1998 http: www.orellly.com/

Fri Mar 13 12:16:47 1998 http; www2.binevolve.com/

Sun Mar 8 21:01:27 1998 http: www.perl.org/

Tue Nov 18 13:41:32 1997 http: www.perl.com/universal/header.map

Wed Oct 1 12:55:13 1997 http: www.songline.com/

Sun Aug 17 21:43:51 1997 http: www.perl.com/graphlcs/perlhome header.jpg

Sun Aug 17 21:43:47 1997 http: www.perl.com/graphics/perl ld 313c.gif

Sun Aug 17 21:43:46 1997 http: www.perl.com/graphics/ora logo.gif

Sun Aug 17 21:43:44 1997 http: www.perl.coro/graphics/header-nav.gif



20.9. Создание шаблонов HTML 717

Маленькие программы, которые выполняют свою узкую задачу и могут объединяться в более мощные конструкции, - верный признак хорощего программирования. Более того, можно было бы заставить xurl работать с файлами и организовать фактическую выборку содержимого URL в Web другой программой, которая бы передавала свои результаты xurl, churl или surl. Вероятно, эту программу следовало бы назвать мг/, но программа с таким именем уже существует: в комплекс модулей LWP входит программа Iwp-request с синонимами HEAD, GET и POST для выполнения этих операций в сценариях командного интерпретатора.

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

Документация по модулям LWP::UserAgent, HTTP::Request и URI::URLc CPAN; рецепт 20,7.

20.9. Создание шаблонов HTML

Проблема

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

Решение

Если вы ограничиваетесь заменой ссылок иа переменные, используйте функцию template:

sub template {

my (Sfilename, Sfillings) = @ ; my $text;

local $/; tt Режим поглощающего ввода (undef)

local *F; tt Создать локальный манипулятор

open(F, "< Sfilename") return;

Stext = <F>; # Прочитать весь файл

close(F); # Игнорировать код возврата

# Заменить конструкции %%...%% значениями из хэша %$fillings

Stext =" s{ %% ( ..?)%%}

{ exists( $fillings->{S1} ) ? $fillin9S->{S1i

}gsex; return $text;

В этом случае используемые данные выглядят так:

<!- simple, template для внутренней функции templateO -> <HTML><HEAD><TlTLE>Report for %%username%%</TITLE></HEAD> <B0DY><H1>Report for %%username%%</H1>

%%username%% logged in %%count%% times, for a total of %%total%% minutes.



Для расширения полноценных выражений используйте модуль Text::Teraplate с CPAN, если вы можете гарантировать защиту данных от постороннего вмешательства. Файл данных для Text::Template выглядит так:

<- fancy template for Text Template -> <HTML><HEAD><TITLE>Report for {$userl</TITLE></HEAD> <B0DY><H1>Report for {$user}</H1>

{ lcfirst($user) } logged in {$count} times, for a total of { int($seconds / 60) } minutes

Комментарий

Параметризованный ввод в сценариях CGI хорош по многим причинам. Отделение программы от данных дает возможность другим людям (например, дизайнерам) изменять код HTML, пе трогая программы. Еще лучше то, что две программы могут работать с одним шаблоном, поэтому стилевые изменения шаблона немедленно отразятся на обеих программах.

Предположим, вы сохранили в файле первый шаблон из решения. Ваша программа CGI содержит определение функции template (см. выше) и соответствующим образом задает значения переменных $whats his name, $login count и $minute used. Шаблон заполняется просто:

%fields = (

username => $whats his name, count => $login count, total => $minute used,

print template( /home/httpd/templates/simple template \%fields)

Файл шаблона содержит ключевые слова, окруженные двойными символами % (%%КЛЮЧЕВОЕ-СЛОВО%%). Ключевые слова ищутся в хэше %$f illings, ссылка на который передается template в качестве второго аргумента. В примере 20.7 приведен более близкий к реальности пример, использующий базу данных SQL.

Пример 20.7. userrepl

#1/usr/bin/perl -w

# userrepl - вывод данных о продолжительности работы пользователей

# с применением базы данных SQL

use DBI

use CGI qw( standard),

# Функция templateO определена в решении (см выше)

Suser = param( username ) or die No username ,

Sdbh = DBl->connect( dbi mysql connections mysql domain com 3306 ,

connections , seekritpassword ) or die Couldn t connect\n ,

Ssth = Sdbh->prepare(« END OF SELECT ) or die Couldn t prepare SOL ,

SELECT COUNT(duration),SUM(duration)

FROM logins WHERE usernarae= Suser



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