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. Примеры
1. Введение
2. Установка Web-сервера Apache
3. Основные характеристики языка Perl
   3.1. Стандартные потоки ввода и вывода
   3.2. Переменные в языке Perl
     3.2.1. Скаляры или скалярные переменные
     3.2.2. Списки в Perl
     3.2.3. Массивы
     3.2.4. hash (хэш)
4. Операторы языка Perl
   4.1. Термы
   4.2. Инфиксный оператор ссылки
   4.3. Операторы сравнения
     4.3.1. Операторы сравнения чисел
     4.3.2. Операторы сравнения строк
   4.4. Логические операторы
   4.5. Арифметические операции
   4.6. Операторы связывания по шаблону
   4.7. Условные операторы
   4.8. Операторы условного цикла
   4.9. Операторы перечисляемого цикла
5. Пример на считывание данных из полей формы
6. Работа языка Perl с файлами
   6.1. Дескрипторы в Perl
   6.2. Считывание из файла
   6.3. Записи в файл
   6.4. Регулярные выражения
     6.4.1. Оператор проверки совпадения
     6.4.2. Оператор замены по шаблону
     6.4.3. Метасимволы
     6.4.4. Модификаторы
7. Модули в Perl
8. Пример гостевой книги

.. ../ /

1. Введение.

Язык Perl разработан в середине 70-х для сетей на базе языка С.
Является полнофункциональным языком, но ориентирован на работу с текстами, на выделение фрагментов текстов, на замену одних фрагментов текста другими.

Active Perl 5.0 - здесь только начинается переход к объектам.
Perl уступает технологии PHP/Fi (Perl встраивается в HTML).
Работает под Web-сервер Apache, IIS 4.0.

.. ../ /

2. Установка Web-сервера Apache.

Инсталлировать Apache нужно при остановленных других Web-серверах. Два сервера на одном порту работать не могут.

В папку ProgramFiles/Apache/htdocs поместить *.html
htdocs - эта папка выступает в качестве localhost.

В папку cgi_bin поместить *.cgi

В папке conf/httpd.conf - файл конфигурации Apache.

В блокноте открыть файл httpd.conf.
Найти строку (дважды) #ServerName localhost, убрать # и прописать localhost.

.. ../ /

3. Основные характеристики языка Perl.

Perl и сервер Apache ориентированы на работу под системой Unix, которых большинство в мире, поэтому есть ряд своих особенностей.

Любая Perl программа должна начинаться с
#!usr/local/bin/perl
Это стандарт по умолчанию (так обычно устанавливает системный администратор).

Писать #!perl, если интерпретатор установлен в корень.

В дальнейшем # используется как комментарий.
; - разделитель между операторами.
{Блоки операторов} заключаются в фигурные скобки.

3.1. Стандартные потоки ввода и вывода.

<STDIN>

Стандартное устройство ввода <STDIN> подразумевает ввод данных через стандартный поток.
По умолчанию инициируется с клавиатуры, но возможны следующие особенности:
если программа на языке Perl вызвана из браузера, то стандартным потоком становятся данные, поступающие из браузера.

<STDOUT>

По умолчанию стандартный поток вывода назначается на черный экран монитора. Аналогично, если программа на языке Perl вызвана из браузера, то стандартный поток вывода перенаправляется в браузер.

<STDERR>

Стандартный поток, который выводит сообщение о возникших ошибках.

Perl является языком контекстно-зависимым, т.е. один и тот же оператор может выполняться и записываться по разному, в зависимости от конкретного содержания операции. Очень многие операции и операторы выполняются по умолчанию, например:
<STDIN> < > по умолчанию стандартный поток ввода.
Полная форма записи:
print <STDOUT>, "HELLO";
Обычно пишут: print "HELLO";

Стандартный поток вывода подразумевается интерпретатором.

Еще одна особенность - внутри строк имеем право записывать переменные:
$a="all";
print "Hello" $a;

Пример ex1.pl

#!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 - разбиение на разряды (бухгалтерская запись).

3.2. Переменные в языке Perl.

Бывают трех основных типов.

3.2.1. Скаляры или скалярные переменные.

К скалярным переменным относятся любые числа или строки.
Любая скалярная переменная начинается со знака $.

Если имя скалярной переменной начинается с буквы, то далее она может содержать любые символы кроме $ @ # &.
$a1

Если имя переменной начинается с цифры, то далее могут присутствовать только цифры в имени переменной.

Если имя переменной начинается со специального символа, то имя переменной состоит только из одного этого символа: $!, $&.

Переменная по умолчанию: $_
Если не указано в какую переменную считывать данные, то в этом случае данные могут считываться в переменную по умолчанию.

В переменную a считать значение стандартного ввода: $a=<STDIN>;

3.2.2. Списки в Perl.

Скаляры могут объединяться в списки. Списки это не отдельный тип переменных. Под списком понимается набор скалярных переменных, заключенных в круглые скобки.

($a, $b)

Списки используются при разделении имени поля формы и значения поля формы.
join
join - операция, которая применяется к списку.
Список задается только перечислением его элементов.
join объединяет элементы списка в одну строку, разделяя их символом разделителя.
$t=join("символ_разделитель"), $a, $b, …);
$t=join("/", "01", "01", "2001");
$t="01/01/2001"
split

Оператор split разделяет строку по какому-либо указанному символу.
read(<STDIN>, $buffer);
В переменную $buffer считываем данные из стандартного потока.

$buffer="i1=paula&i2=1234"
i1 - имя поля, paula - значение поля, i2 - имя поля, 1234 - значение поля.
Теперь эту строку надо разделить с помощью split.
@pairs=split(/&/, $buffer);
Символ-разделитель & делит строку на фрагменты. Нужно взять данные из переменной $buffer с разделителем &.
#$pairs[0]="i1=paula"
#$pairs[1]=" i2=1234"
Здесь цикл предполагается по умолчанию. Это контекстная зависимость языка Perl: если это массив, то нужно обрабатывать все переменные массива.
Если пользователь введет спец. символ в имени, то будет не корректно. Поэтому в JavaScript нужно проверять корректность ввода, иначе в Perl потом будет ошибка.
Цикл:
($name, $value)=split(/=/, @pairs);
#$name="i1", $value=" paula"

3.2.3. Массивы.

Массивы задаются начиная с символа @
@a=(1,2,3,4);
Обращение к элементам массива производится как к скалярам.
$a[0]=1
$a[1]=2
a - имя массива @#a - это выражение определяет порядковый номер последнего элемента массива, но зависит от версии (под Unix - так).
Операторы push и pop.
Оператор push добавляет элемент в конец массива, т.е. массивы являются динамическими и их размер можно изменить в процессе работы программы как в сторону увеличения с помощью оператора push, так и уменьшения с помощью оператора pop.
push(@a, $p)
push(@a, 5) >> (1,2,3,4,5)
pop(@a) >> (1,2,3,4)
Оператор unshift.
Добавляет элемент в начало массива.
unshift(@a, $f)
unshift(@a, 0) >> (0,1,2,3,4)
Оператор shift.
Удаляет первый элемент массива.
shift(@a) >> (1,2,3,4)
print @a;
- выводит элементы массива подряд в одну строку без пробела.
1234

3.2.4. hash (хэш).

Это массивы, но в них элементы не нумеруются, а обозначаются по именам. Эти массивы состоят из двух столбцов.

Ключевое поле значащее поле
Fruit apple
Drink whisky
Vegetable tomato

Такая форма представления информации характерна для БД формата dbm (Берклеевские базы данных, БД 5 нормальная форма http://www.vlata.com/access/vfp ).

Переменные CGI представляются также в виде хэша.

request_method GET
content_length
(сколько байт было передано)
200

Хэши обозначаются начиная со знака %

%имя_хэша
Три способа задания хэш:
1). %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 - окружение)
В стандартном хэше %ENV всегда содержатся переменные окружения (переменные CGI).

.. ../ /

4. Операторы языка Perl.

4.1. Термы.

Под термами понимаются любые выражения, заключенные в кавычки или скобки.
Термы имеют наивысший приоритет.

4.2. Инфиксный оператор ссылки.

-> Предназначен для создания в переменной ссылки на массив или хэш.

4.3. Операторы сравнения.

Различают операторы сравнения чисел и операторы сравнения строк.

4.3.1. Операторы сравнения чисел.

<, >, <=, >=, ==, !=, <=>
$x=($a <=> $b)
Переменная x может принять значение -1, 0, 1 в зависимости как соотносится a и b.
$x={ -1, < (a<b)
0, = (a=b)
1, > (a>b)

4.3.2. Операторы сравнения строк.

Здесь мы сравниваем только длину строк:

lt - означает, что левая строка больше правой (в смысле длиннее);

gt - оператор означает, что левая строка меньше правой, т.е. короче;

ge - левая строка меньше, либо равна правой (сравнение идет по количество байт, т.е. символов);

le - левая строка больше либо равна правой.

Сравнение по содержанию: eq - означает, что левая строка равна правой (точная копия, вплоть до регистра);
ne - левая строка не равна правой, не совпадает по символам.

cmp идентичен <=>
$x=cmp($s1,s2)
$x={ -1, gt (короче)
0, (равны по длине)
1, lt (длинее)

4.4. Логические операторы.

ИЛИ ||, or
If($a==2 or $b==4){
	}
И &&, and

4.5. Арифметические операции.

+ -, *, /
i++; #i=i+1;
i--; # i=i-1;
++i;
--j;
$a=$i++ +$b; i сложится с b, потом увеличится на единицу
$a=++$i+$b; i сначала увеличится на единицу, потом сложится с b

Операция конкатенации в Perl обозначается точкой.

4.6. Операторы связывания по шаблону.

=~ - совпадение с шаблоном
!~ - несовпадение с шаблоном

4.7. Условные операторы.

1).
if(условие){
блок операторов,
если условие выполняется}
elsif(условие2){
блок операторов,
если условие2 выполняется}
…	(блок elsif  м.б. сколь угодно много)
else{
блок операторов,
если ни одно условие 
не выполняется}
2). Еще один условный оператор (как бы перевернутый if)
unless(условие){
блок операторов,
если условие не выполняется}
else{
блок операторов,
если условие выполняется}

4.8. Операторы условного цикла.

1).
while(условие){
блок операторов,
если условие выполняется
}
2).
until(условие){
блок операторов,
если условие не выполняется
}
until($i<=4){
print…
}

4.9. Операторы перечисляемого цикла.

for
for($i=0; $i<=10; $i++){
операторы цикла}
Второй способ записи - перечисление в массиве или в хэше:
for each $i in @array{
операторы цикла}
Переменная i принимает последовательно все значения соответствующего массива.

.. ../ /

5. Пример на считывание данных из полей формы.

с:\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
Вводим имя и пароль и отправляем на сервер.

Текст ex4pl.html

<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>

Текст ex4.cgi

#!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>";
}

.. ../ /

6. Работа языка Perl с файлами.

Функция (или оператор, в Perl нет разделения) open открывает указанный файл
open(файловая_переменная, "дескриптор имя_файла");
open(f1, ">> file.txt");
f1 - файловая переменная (без спец.символов) - эта та переменная, которой сопоставляется файл.
При открытии файла все содержимое переносится в оперативную память (в f1).

6.1. Дескрипторы в Perl.

Дескриптор - это условное обозначение, которое определяет вид доступа к файлу (на запись, на чтение,…).

< файл открыт только на чтение.

> файл открыт только на перезапись (старые данные будут стерты и записаны новые).

>> только на дозапись, т.е. новая информация будет записываться в конец файла (в asp такого режима нет). Удобно создавать формы, гостевые книги.

+> чтение и перезапись (это мало в каких языках есть).

+< чтение и дозапись (последовательность может быть любой).

Если файл не существовал, то он будет создан в результате выполнения оператора open (при открытии на запись).

6.2. Считывание из файла.

read(файловая_переменная, $переменная, сколько байт считать);
сколько байт считать - необязательный параметр, если не указан, то будет считан весь файл.

read(f1, $temp, 20);
Из переменной f1 в переменную $temp считать 20 байт.

6.3. Записи в файл.

print файловая_переменная "строка, которую записываем в файл";
print f1 "Hello";
Этот оператор записывает строку в f1 (оперативную память).
Можно вывести списком ($s1, $s2,…)

\n перевод строки

close файловая_переменная;
close f1;
Функция закрывает файловую переменную и записывает ее содержимое в файл на диске.

6.4. Регулярные выражения.

Эта часть языка Perl обуславливает его широкое использование.
Можно выделять фрагменты строк по шаблону.

6.4.1. Оператор проверки совпадения.

m/строка_сравнения/модификатор
if($temp=~m/stop/){exit;}
else
{#продолжение работы}

~ это оператор подобия, называется оператором привязки

if($temp eq "stop")
Существует модификатор i, который указывает на регистронезависимость при сравнении.
if($temp=~m(stop/i){exit;}
else
{#продолжение работы}

6.4.2. Оператор замены по шаблону.

1). Оператор подстановки.
~s/исходная строка/строка замены/модификатор;

$temp="That is bad";
$temp=~s/BAD/good/i;
#$temp=" That is good";
Оператор s сравнивает строки целиком.
2). Оператор замены.
tr, либо y (можно писать и так и так)
tr/исходная строка/строка замены/модификатор
tr осуществляет посимвольную замену, сравнивает каждый символ с каждым.
$temp=~tr/b/s;
#$temp="That is sad";
Модификаторы регулярных выражений являются "жадными", заменяют все найденные совпадения в строке посимвольно.

6.4.3. Метасимволы.

Шаблоны состоят из метасимволов.
Метасимвол - это такой символ, который обозначает не только самого себя, но и группу других символов.
*.doc
mydoc?.doc (mydoc1.doc; mydoc2.doc; …)

* - все возможные символы

? - один любой символ

\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/…/

6.4.4. Модификаторы.

Модификаторы уточняют действия метасимволов, позволяют ограничить, конкретизировать "жадность".

* модификатор указывает, что нужно искать любое количество совпадений.

+ означает, что метасимвол нужно использовать один или большее число раз.

? указывает, что совпадение может встречаться один раз или не одного раза.

{n} n - какое-то число или переменная, этот модификатор указывает, что нужно искать ровно n-совпадений.

Пример.

$s="1+2-3*4";
if($s=~m/(\d)(?!\+)/){
…}
Найти цифру, перед которой не стоит знак "+"
/(\d)(?!\+)/ строка сравнения
(\d) метасимвол
(?!\+) модификатор

.. ../ /

7. Модули в Perl.

Внешние модули всегда имеют расширение .pm и включение их производится за строкой, где путь к интерпретатору Perl.
#!perl
use имя_модуля;
CGI - это модуль, который обеспечивает взаимодействие с браузером.
Для модуля CGI нужно создавать экземпляр объекта.
g=new CGI;
Модуль CGI полностью дублирует HTML.
#!perl
use CGI;
q->имя_функции(параметры);
-> инфиксный оператор ссылки.
q->textfield(name=>i1);
#<input type=text name=i1>
В БД, с которой работает Perl, есть ряд особенностей. Perl ориентирован на платформу UNIX, поэтому он может работать только с *.dbm.
Для работы с реляционными БД существует модуль Sql.pm (содержит функции, которые позволяют обращаться к ODBC).
БД формата *.dbm представляет собой обычный хэш.

ключевое слово значащее поле
   

Если в БД все таблицы имеют только 2 поля, ключевое слово и значащее поле, то эта БД приведена к пятой нормальной форме, обозначается 5НФ.
Для работы с традиционными БД используется модуль AnyDBM_File (любой DBM_File http://www.vlata.com/access/vfp).

Этот модуль содержит две основные функции:
1). Аналогична функции open для текстовых файлов.
dbmopen(%имя_хэша, "имя_файла_Базы_Данных", параметр)
В качестве первого параметра указывается имя хэша, в который будет счинана БД.
В качестве второго параметра указывается имя файла, в котором содержится БД, причем для БД *.dbm всегда создается два файла с одинаковым именем, но с разными расширениями.
Файл *.pag - содержит таблицы БД.
Файл *.dir - содержит связи между этими таблицами.
Третий параметр стандартный, указывает источник информации.
0660 - считывание с магнитного диска.

2).Эта функция закрывает доступ к БД и перезаписывает (полностью обновляет) файлы *.pag и *.dir.

dbmclose(%имя_хэша)

.. ../ /

8. Пример гостевой книги.

Текст ex6_1.html

- работает на стороне клиента.
<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>

Текст ex7.cgi

#!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>";
}
Каждая строка выводится в браузер.
Здесь производится вывод и в БД, используем модуль AnyDBM_File
dbmopen(%db,"ex6",0660);
Открываем БД с именем ex6, которая находится на магнитном диске.

$db{$MYDATA{'f1'}}=($MYDATA{'f2'},$temp);
В хэш БД заносим то, что заносится в переменную $temp
$temp=$MYDATA{$i};

[ Home ] [ Top ] [ Web-дизайн ] [ Web-мастеринг ] [ Статьи, обзоры ] [ Литература ] [ Ссылки ]
[ Страничка юмора ] [ Гостевая книга ] [ E-Mail ]

ЦКО при МГТУ им.Н.Э.Баумана
Hosted by uCoz