Internet технологии | |
(конспект) |
Работа в Internet | Основы HTML | Web-дизайн | Web-мастеринг |
Введение
E-mail
Поиск информации
FTP
|
Введение
Ссылки и иллюстрации
Таблицы и списки
Фреймы и формы
|
Введение DreamWeaver HomeSite
Каскадные таблицы стилей CSS
Photoshop 5.5 для Web-дизайна
AdobeImageReady 2.0
Ulead GifAnimator 2.0
|
JavaScript CGI IIS 4.0 ASP. VBScript Работа с БД >> Perl
Java
|
Курс: Web-мастеринг |
Язык Perl. Примеры |
.. | ../ | / |
Active Perl 5.0 - здесь только начинается переход к объектам.
Perl уступает технологии PHP/Fi (Perl встраивается в HTML).
Работает под Web-сервер Apache, IIS 4.0.
.. | ../ | / |
В папку ProgramFiles/Apache/htdocs
поместить *.html
htdocs
- эта папка выступает в качестве localhost
.
В папку cgi_bin
поместить *.cgi
В папке conf/httpd.conf
- файл конфигурации Apache.
В блокноте открыть файл httpd.conf
.
Найти строку (дважды) #ServerName localhost
, убрать #
и прописать localhost
.
.. | ../ | / |
Любая Perl программа должна начинаться с
#!usr/local/bin/perl
Это стандарт по умолчанию (так обычно устанавливает системный администратор).
Писать #!perl
, если интерпретатор установлен в корень.
В дальнейшем # используется как комментарий.
; - разделитель между операторами.
{Блоки операторов} заключаются в фигурные скобки.
Perl является языком контекстно-зависимым, т.е. один и тот же оператор может выполняться и записываться по разному, в зависимости от конкретного содержания операции. Очень многие операции и операторы выполняются по умолчанию, например:
<STDIN> < >
по умолчанию стандартный поток ввода.
Полная форма записи:
print <STDOUT>, "HELLO";
Обычно пишут: print "HELLO";
Стандартный поток вывода подразумевается интерпретатором.
Еще одна особенность - внутри строк имеем право записывать переменные:
$a="all";
print "Hello" $a;
#!usr/local/bin/perl print"Enter Your name:"; $a=<STDIN>; print"Hello $a\n";
Start >> Programs >> CommandPrompt c:\>cd perl c:\perl>cd bin c:\perl\bin>perl ex1.pl
Данные в Perl могут быть записаны в 10-ной, 8-ной, 16-ной форме.
Число в 8-ной форме записи должно начинаться со знака %
(например, %7
).
Число в 16-ной форме записи начинается с 0хB2 0x12
1_234_567_890
- разбиение на разряды (бухгалтерская запись).
$
.
Если имя скалярной переменной начинается с буквы, то далее она может содержать любые символы кроме $ @ # &.
$a1
Если имя переменной начинается с цифры, то далее могут присутствовать только цифры в имени переменной.
Если имя переменной начинается со специального символа, то имя переменной состоит только из одного этого символа: $!, $&.
Переменная по умолчанию: $_
Если не указано в какую переменную считывать данные, то в этом случае данные могут считываться в переменную по умолчанию.
$a=<STDIN>;
($a, $b)
join
- операция, которая применяется к списку.join
объединяет элементы списка в одну строку, разделяя их символом разделителя.
$t=join("символ_разделитель"), $a, $b, …); $t=join("/", "01", "01", "2001"); $t="01/01/2001"
Оператор split
разделяет строку по какому-либо указанному символу.
read(<STDIN>, $buffer);
В переменную $buffer
считываем данные из стандартного потока.
$buffer="i1=paula&i2=1234"
i1
- имя поля, paula
- значение поля, i2
- имя поля, 1234
- значение поля.@pairs=split(/&/, $buffer);
#$pairs[0]="i1=paula" #$pairs[1]=" i2=1234"Здесь цикл предполагается по умолчанию. Это контекстная зависимость языка Perl: если это массив, то нужно обрабатывать все переменные массива.
($name, $value)=split(/=/, @pairs); #$name="i1", $value=" paula"
@
@a=(1,2,3,4);Обращение к элементам массива производится как к скалярам.
$a[0]=1 $a[1]=2
a
- имя массива
@#a
- это выражение определяет порядковый номер последнего элемента массива, но зависит от версии (под Unix - так).
push
добавляет элемент в конец массива, т.е. массивы являются динамическими и их размер можно изменить в процессе работы программы как в сторону увеличения с помощью оператора push
, так и уменьшения с помощью оператора pop
.
push(@a, $p) push(@a, 5) >> (1,2,3,4,5) pop(@a) >> (1,2,3,4)
unshift(@a, $f) unshift(@a, 0) >> (0,1,2,3,4)
shift(@a) >> (1,2,3,4)
Ключевое поле | значащее поле |
Fruit | apple |
Drink | whisky |
Vegetable | tomato |
Такая форма представления информации характерна для БД формата dbm (Берклеевские базы данных, БД 5 нормальная форма http://www.vlata.com/access/vfp ).
Переменные CGI представляются также в виде хэша.
request_method | GET |
content_length (сколько байт было передано) | 200 |
Хэши обозначаются начиная со знака %
%имя_хэша
%h=();
- описали пустой хэш.
$h{key1}="Hello"; $h{key2}="all"; …
key1
- имя ключевого поля
К каждому элементу обращаемся как к скаляру.
key1 | Hello |
key2 | all |
2).
%h => (key1 => Hello, key2 => all);3). "Дурное" перечисление, просто через запятую.
%h=(key1, Hello, key2, all);Четные элементы списка являются ключевыми полями, нечетные - значащими. Это неудобно, нужно следить за чередованием.
Существует хэш по умолчанию, который обозначается
%_
%ENV
(от англ. enveronment - окружение).. | ../ | / |
->
Предназначен для создания в переменной ссылки на массив или хэш.
<, >, <=, >=, ==, !=, <=> $x=($a <=> $b)Переменная x может принять значение -1, 0, 1 в зависимости как соотносится a и b.
$x={ | -1, < (a<b) 0, = (a=b) 1, > (a>b) |
lt - означает, что левая строка больше правой (в смысле длиннее);
gt - оператор означает, что левая строка меньше правой, т.е. короче;
ge - левая строка меньше, либо равна правой (сравнение идет по количество байт, т.е. символов);
le - левая строка больше либо равна правой.
Сравнение по содержанию:
eq - означает, что левая строка равна правой (точная копия, вплоть до регистра);
ne - левая строка не равна правой, не совпадает по символам.
$x=cmp($s1,s2)
$x={ | -1, gt (короче) 0, (равны по длине) 1, lt (длинее) |
ИЛИ ||, or If($a==2 or $b==4){ } И &&, and
+ -, *, / i++; #i=i+1; i--; # i=i-1; ++i; --j;
$a=$i++ +$b;
i сложится с b, потом увеличится на единицу$a=++$i+$b;
i сначала увеличится на единицу, потом сложится с b
Операция конкатенации в Perl обозначается точкой.
if(условие){ блок операторов, если условие выполняется} elsif(условие2){ блок операторов, если условие2 выполняется} … (блок elsif м.б. сколь угодно много) else{ блок операторов, если ни одно условие не выполняется}2). Еще один условный оператор (как бы перевернутый if)
unless(условие){ блок операторов, если условие не выполняется} else{ блок операторов, если условие выполняется}
while(условие){ блок операторов, если условие выполняется }2).
until(условие){ блок операторов, если условие не выполняется } until($i<=4){ print… }
for($i=0; $i<=10; $i++){ операторы цикла}Второй способ записи - перечисление в массиве или в хэше:
for each $i in @array{ операторы цикла}Переменная i принимает последовательно все значения соответствующего массива.
.. | ../ | / |
с:\ProgramFiles\ApacheGroup\Apache
Файлы *.html
поместить в папку htdocs
Файлы *.cgi
поместить в папку cgi-bin
http://localhost/имя_файла.html
http://localhost/cgi-bin/ex4.cgi
ex4.cgi
- текст на Perl
http://localhost/ex4pl.html
ex4.cgi
- текст на Perl
Данные из формы передаются на сервер в файл ex4.cgi
Указан относительный путь к файлу /cgi-bin/ex4.cgi
Вводим имя и пароль и отправляем на сервер.
<HTML> <HEAD> <TITLE>Формы и Perl</TITLE> </HEAD> <BODY> <HR> <FORM METHOD="GET" ACTION="/cgi-bin/ex4.cgi"> Name:<BR> <INPUT TYPE="text" NAME="name" SIZE=10><BR> Family:<BR> <INPUT TYPE="text" NAME="family" SIZE=15><BR><BR> <INPUT TYPE="reset"> <INPUT TYPE="submit"> </FORM> <HR> <FORM METHOD=POST ACTION="/cgi-bin/ex4.cgi"> File:<BR> <INPUT TYPE=file NAME="upfile"><BR><BR> <INPUT TYPE="reset"> <INPUT TYPE="submit"> </FORM> <HR> </BODY> </HTML>
#!perl print "Content-type: text/html\n\n"; if ($ENV{'REQUEST_METHOD'} eq 'GET') { @data=split(/&/, $ENV{'QUERY_STRING'}); print "METHOD=GET<BR>"; } elsif ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $temp, $ENV{'CONTENT_LENGTH'}); @data=split(/&/, $temp); print "METHOD=POST CONTENT_LENGTH=$ENV{'CONTENT_LENGTH'}<BR>"; } else { exit; } foreach $i (@data) { ($name, $value)=split(/=/, $i); $MYDATA{$name}=$value; print "fild=<B>$name</B>; value=<B>$value</B>;<BR>"; }
#!perl
указали путь к интерпретатору Perl (нужно обратиться к системному администратору)
print "Content-type: text/html\n\n";
эта строка выдает браузеру команду, что все последующие посылки в браузер (весь текст, посылка информации) нужно рассматривать как html-программу.
$ENV
- стандартный хэш, где хранятся переменные сервера.
Проверяем метод передачи данных от сервера.
($ENV{'REQUEST_METHOD'}
обращение к элементу хэша с ключевым полем REQUEST_METHOD
, поэтому знак $ (обозначает скаляр).
Массив @data=split(/&/, $ENV{'QUERY_STRING'});
Считывание строки, разделение строки по указанному символу.
Элементы массива имеют значения:
# $data[0]='name=dd'
# $data[1]='value=12345'
elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN, $temp, $ENV{'CONTENT_LENGTH'});
считываем данные из стандартного потока ввода в произвольную переменную $temp
(этот параметр указывает, сколько байт считывать)
CONTENT_LENGTH
указывает, сколько байт было считано.
@data=split(/&/, $temp);
Разделяем строку по /&/
Элементы массива такие же, т.к. строка одна и та же.
print "METHOD=POST CONTENT_LENGTH=$ENV{'CONTENT_LENGTH'}<BR>";
else { exit; }Полное прекращение работы программы, обрабатываем данные только методом GET и POST.
Далее нужно вывести информацию.
foreach $i (@data) {
Цикл по массиву @data
, перебираем все значения в массиве data.
($name, $value)=split(/=/, $i);
В этот список заносим значения, разделенные по знаку /=/
$MYDATA{$name}=$value;
Шаг 1: $name=name, $value=dd
Шаг 2: $name=value, $value=1234
print "fild=<B>$name</B>; value=<B>$value</B>;<BR>";
}
.. | ../ | / |
open(файловая_переменная, "дескриптор имя_файла");
open(f1, ">> file.txt");f1 - файловая переменная (без спец.символов) - эта та переменная, которой сопоставляется файл.
<
файл открыт только на чтение.
>
файл открыт только на перезапись (старые данные будут стерты и записаны новые).
>>
только на дозапись, т.е. новая информация будет записываться в конец файла (в asp такого режима нет). Удобно создавать формы, гостевые книги.
+>
чтение и перезапись (это мало в каких языках есть).
+<
чтение и дозапись (последовательность может быть любой).
read(файловая_переменная, $переменная, сколько байт считать);
сколько байт считать - необязательный параметр, если не указан, то будет считан весь файл.
read(f1, $temp, 20);
Из переменной f1 в переменную $temp считать 20 байт.
print файловая_переменная "строка, которую записываем в файл";
print f1 "Hello";
Этот оператор записывает строку в f1 (оперативную память).
Можно вывести списком ($s1, $s2,…)
\n
перевод строки
close файловая_переменная;
close f1;
Функция закрывает файловую переменную и записывает ее содержимое в файл на диске.
m/строка_сравнения/модификатор
if($temp=~m/stop/){exit;} else {#продолжение работы}
~ это оператор подобия, называется оператором привязки
if($temp eq "stop")Существует модификатор i, который указывает на регистронезависимость при сравнении.
if($temp=~m(stop/i){exit;} else {#продолжение работы}
~s/исходная строка/строка замены/модификатор; $temp="That is bad"; $temp=~s/BAD/good/i; #$temp=" That is good";Оператор s сравнивает строки целиком.
tr/исходная строка/строка замены/модификаторtr осуществляет посимвольную замену, сравнивает каждый символ с каждым.
$temp=~tr/b/s; #$temp="That is sad";Модификаторы регулярных выражений являются "жадными", заменяют все найденные совпадения в строке посимвольно.
* - все возможные символы
? - один любой символ
\n - новая строка
\t - табуляция
\w - один алфавитно-цифровой символ, либо знак подчеркивания (буква, цифра, либо знак подчеркивания)
\d - обозначает одну цифру
\D - обозначает любую не цифру
\s - обозначает один пробел
\S - один символ, кроме символа пробела
[0-9] - одна цифра
[a-z] - одна любая строчная буква
[A-Z] - одна любая заглавная буква
[a-d] - одна из четырех
[0-9a-dA-E] - допускаются любые комбинированные записи шаблонов (накладываем маску)
$temp=~tr/[0-9a-dA-E]/…Шаблоны используются в регулярных выражениях.
$temp=~tr/\d/…/
* модификатор указывает, что нужно искать любое количество совпадений.
+ означает, что метасимвол нужно использовать один или большее число раз.
? указывает, что совпадение может встречаться один раз или не одного раза.
{n} n - какое-то число или переменная, этот модификатор указывает, что нужно искать ровно n-совпадений.
$s="1+2-3*4"; if($s=~m/(\d)(?!\+)/){ …}Найти цифру, перед которой не стоит знак "+"
/(\d)(?!\+)/
строка сравнения(\d)
метасимвол(?!\+)
модификатор.. | ../ | / |
#!perl use имя_модуля;CGI - это модуль, который обеспечивает взаимодействие с браузером.
g=new CGI;Модуль CGI полностью дублирует HTML.
#!perl use CGI; q->имя_функции(параметры);
->
инфиксный оператор ссылки.
q->textfield(name=>i1); #<input type=text name=i1>В БД, с которой работает Perl, есть ряд особенностей. Perl ориентирован на платформу UNIX, поэтому он может работать только с *.dbm.
ключевое слово | значащее поле |
Если в БД все таблицы имеют только 2 поля, ключевое слово и значащее поле, то эта БД приведена к пятой нормальной форме, обозначается 5НФ.
Для работы с традиционными БД используется модуль AnyDBM_File (любой DBM_File http://www.vlata.com/access/vfp).
dbmopen(%имя_хэша, "имя_файла_Базы_Данных", параметр)В качестве первого параметра указывается имя хэша, в который будет счинана БД.
2).Эта функция закрывает доступ к БД и перезаписывает (полностью обновляет) файлы *.pag и *.dir.
dbmclose(%имя_хэша)
.. | ../ | / |
<html> <head> <title> Guest book </title> </head> <body> <h1>Guest book<br> Input Your Message<br> </h1> <form method=post action='/cgi-bin/ex7.cgi'> <textarea name="name" rows=2 cols=12> </textarea> <input type=submit value="Send message" </form> </body> </html>
#!perl use AnyDBM_File; print "Content-type: text/html\n\n"; if ($ENV{'REQUEST_METHOD'} eq 'GET'){ @data=split(/&/,$ENV{'QUERY_STRING'}); print "METHOD=GET"; } elsif ($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN, $temp, $ENV{'CONTENT_LENGTH'}); @data=split(/&/,$temp); print "METHOD=POST<BR>LENGTH=$ENV{'CONTENT_LENGTH'}"; } else { exit; } foreach $i (@data){ ($name,$value)=split(/=/,$i); $value=~tr/+/ /; $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("c",hex($1))/eg; # pack - функция, которая получает на входе список # значений и упаковывает в бинарную структуру (скаляр), # который возвращает в качестве результата. $MYDATA{$name}=$value; # print "$name=$MYDATA{$name}<BR>"; # c - означает, что для упаковки используются однобайтовые # целые числа. } open(FILE,">>ex6.txt"); print FILE "<HR>\n"; foreach $i (keys(%MYDATA)){ print FILE "$MYDATA{$i}\n"; $temp=$MYDATA{$i}; } close(FILE); open(FILE,"<ex6.txt"); while ($line=<FILE>){ print "$line<BR>"; } close(FILE); dbmopen(%db,"ex6",0660); $db{$MYDATA{'f1'}}=($MYDATA{'f2'},$temp); dbmclose(%db);
print "Content-type: text/html\n\n";
Текст, выводимый в браузер, следует воспринимать как программу на HTML.
read(STDIN, $temp, $ENV{'CONTENT_LENGTH'});
'CONTENT_LENGTH'
- сколько байт послано.
Считать из стандартного потока ввода (браузера) в переменную с именем $temp.
@data=split(/&/,$temp);
Размещаем элементы в массиве @data.
# <textarea name="name"…> # $data[0]='name=Hello' # $data[1]='=Send message'Второй элемент массива - кнопка, у нее нет имени (name - пусто).
Формируем список, состоящий из переменных name и value с помощью оператора (функции) split, которая раздеяет по знаку "="
foreach $i (@data){ ($name,$value)=split(/=/,$i);
# $name='name'
- имя поля# $value='Hello'
- значение
Дальше начинаются регулярные выражения.
$value=~tr/+/ /;
На некоторых серверах может быть 'Hello+', появляется '+' как символ окончания передачи. Чтобы его отсечь, используем оператор замены tr, заменяем '+' на пробел.
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("c",hex($1))/eg;
Ищем последовательность, которая начинается со знака %, состоит из двух символов.
[буква от a до f или символ от 0 до 9]
Ищем 16-ричные коды, т.е. ASCI-коды символов.
%a0 %90 %AB
Функция pack производит замену 16-ричного числа на соответствующий символ (стандартная функция языка Perl).
Используются два модификатора e и g.
e - обозначает, что искать замену нужно в том числе и в кавычках, если пользователь наберет текст в кавычках.
g - обозначает, что нужно проводить глобальный поиск во всей строке.
pack - для случая, когда пользователь наберет \ . % и т.п.
Можно попробовать метод GET и посмотреть строку, где будет 16-ричный код.
open(FILE,">>ex6.txt");
print FILE "<HR>\n";
Открываем текстовый файл ex6.txt и запивываем тэг <HR> - горизонтальную черту.
foreach $i (keys(%MYDATA)){ print FILE "$MYDATA{$i}\n"; $temp=$MYDATA{$i}; }Записываем в файл значащее поле от ключевого.
open(FILE,"<ex6.txt");
Открываем файл теперь на чтение.
while ($line=<FILE>){
Это команда на считывание очередной строки из файла.
Условие на считывание выполняется, пока строка не пустая.
while ($line=!null)
print "$line<BR>"; }Каждая строка выводится в браузер.
dbmopen(%db,"ex6",0660);
$db{$MYDATA{'f1'}}=($MYDATA{'f2'},$temp);
В хэш БД заносим то, что заносится в переменную $temp
$temp=$MYDATA{$i};
[ Home ] [ Top ] [ Web-дизайн ] [ Web-мастеринг ] [ Статьи, обзоры ] [ Литература ] [ Ссылки ]
[ Страничка юмора ]
[ Гостевая книга ] [ E-Mail ]