PERL - статьи
А что дальше?
По идее, если все вы сделали правильно, то скрипт установлен - его можно запускать и, возможно, настроить какие-нибудь опции, но все это происходит уже в привычной форме, через окно броузера. Очень вероятно, что скрипт не запустится и выдаст ошибку - проверьте, правильно ли вы все сделали! Все мои ошибки, возникали из-за моей невнимательности или когда я, изображая Билл Гейтса, пытался маааленько изменить код - а Perl то я не знаю ;-)В общем, что-то я поставил, кое с чем еще извращаюсь - зайдите ко мне на сайт, посмотрите!
Альтернативные шаблоны
Вы можете задать несколько альтернативных шаблонов, используя символ | как разделитель. Альтернативные шаблоны позволяют превратить процедуру поиска из однонаправленного процесса в разветвленный: если не подходит один шаблон perl подставляет другой и повторяет сравнение, и так до тех пор, пока не иссякнут все возможные альтернативные комбинации. Например, следующий фрагмент проверяет, не ввел ли пользователь "exit", "quit" или "stop":while (<>){ if(m/exit|quit|stop/){exit;} }
Чтобы было ясно, где начинается и где заканчивается набор альтернативных шаблонов, их заключают в круглые скобки - иначе символы, расположенные справа и слева от группы шаблонов, могут смещаться с альтернативыми шаблонами.
В следующем примере метасимволы ^ и $ обозначают начало и конец строки и отделяются от набора альтернативных шаблонов с помощью скобок: while (<>){ if(m/^(exit|quit|stop)$/){exit;} }
Альтернативные варианты перебираются слева направо. Как только найдена первая альтернатива, для которой выполняется совпадение с шаблоном, перебор прекращается. Участки шаблона, заключенные в круглые скобки, выполняют специальную роль при выполнении операций поиска и замены. Если символ \ находится в квадратных скобках, он интерпретируется как обычный символ. Поэтому если вы используете конструкцию шаблона вида [Tim|Tom|Tam], то она будет эквивалентна классу символов [Tioam|]. Точно так же большинство других метасимволов и команд, специфичных для регулярных выражений - в частности, квантификаторы и мнимые символы, описанные в двух последующих разделах, - внутри квадратных скобок превращаются в обычные символы или escape-последовательности текстовых строк.
Анимация
Когда говорят о каком-то популярном сайте,то частенько к преимуществам относят и анимацию. Действительно,когда изображение изменяется (и особенно к месту ;)),то это смотрится и пользователю нравится.Говоря об анимации нужно сразу отметить что нет лучшего способа. Анимацию можно сделать ДЕСЯТКАМИ Способов,каждый хорош в своей области применения. Я перечислю только некоторые из них,которые чаще всего применяются:
Самый простой,но наименее функциональный способ это GIF с анимацией.
Потом можно воткнуть анимационный файл MPEG или AVI они более отражают суть анимации, но имеют недостаток,что для проигрывания их на некоторых браузерах нужны специальные подключаемые модули.К тому же они не интерактивны.
Можно реализовать анимацию в рамках Java-апплета,когда апплет находясь на страничке сам перерисовывается со временем.
Таким же интерактивным средством служит обращение к массиву document.images[] из JavaScript.Достоинство-помимо интерактивности,полная интегрированость с HTML -станичкой.Но может как и предыдущий использоваться только с относительно новыми браузерами,которые поддерживают Java и JavaScript.
В общем в каждом случае выбор остается за вами.Вам решать насколько тот или иной способ хорош в вашей ситуации.Я же познакомлю вас с еще одним.
Вы даже уже были знакомы с этим способом,когда я вам рассказывал о nph- скриптах Теперь когда вы уже так много знаете,можно модифицировать тот , добавив в него вызов картинки по случайному принципу:
#!/usr/bin/perl #nph-animate2.cgi $delay=3; @files = qw(img0.gif img1.gif img2.gif img3.gif);
select (STDOUT); $|=1; #autoflush mode on #Generate header print "HTTP/1.0 200 Okay\n"; print "Content-Type: multipart/x-mixed-replace;boundary=myboundary\n\n"; srand; print "--myboundary\n"; while(1){ $file=$files[int(rand($#files))]; #random file print "Content-Type: image/gif\n\n"; open(PIC,"$file"); print
Конечно одно из самых примитивных применений такой системы.Более мощным примером могло бы послужить отслеживание на сервере какого-нибудь периодически изменяющегося файла и пересылка пользователю обновленной версии.
Такая Система применяется например в Чате,при появлении новых сообщений. Чатовая система достаточно сложна для этого пособия и я не стал сюда ее включать.Однако,если вам очень интересно,то я с удовольствием пришлю ее вам.
Basic_perl
Perl = простота Basic + мощь Cи++Михаил Евдокимов
МИР ПК #08/99
Популярность Internet растет с каждым днем, однако если раньше клиенты провайдеров в основном хотели получить доступ к системам электронной почты, то в последние два года наметилась тенденция к расширению спектра требуемых услуг. Теперь интересы пользователей не ограничиваются электронным почтовым ящиком и поиском какой-либо информации в WWW, они стремятся создавать собственные Web-страницы или даже Web-узлы. Новички организуют простые HTML-страницы, не обращая особого внимания на стиль и дизайн. Но со временем у них появляется желание сделать нечто эффектное и интересное для определенной части Internet-сообщества. И тогда новоявленному Web-мастеру приходится более полно изучить язык разметки гипертекста (HTML) и языки создания клиентских сценариев (VBScript1 и JavaScript)*.
Впоследствии у него могут появиться и новые запросы, — например пообщаться с посетителями своего узла. И в этом случае его уже не удовлетворит, если в тело страницы просто добавится Webmaster. Так, он решит, что неплохо было бы получить достаточно полную информацию о посетителях узла (имена, e-mail, телефоны, факсы и адреса), подсчитать количество посещений, собрать различные мнения и, наконец, создать базу данных, чтобы пользователям сеансов связи предоставить какие-либо определенные услуги. Но для всего этого знания HTML, VBScript1 и Java Script становится явно недостаточно, так как они описывают только технологию взаимодействия сервера и клиента.
Следовательно, нужно изучить языки для создания программ, работающих на сервере. Обычно их разрабатывают на Perl (Practical Extraction and Report Language — практический язык извлечений и отчетов), применяемом также для обработки потоков информации. Изначально предполагалось, что он будет использоваться в ОС Unix, но в дальнейшем Perl стали переносить на другие платформы, и сейчас он существует в самых разных версиях — для Unix, Windows, MS-DOS, OS/2, MacOS, Amiga, Atari ST, VMS, Plan 9 и др.
Для чего нужен Perl?
Perl предназначен для выполнения задач командных сценариев Unix в тех случаях, когда они слишком трудны, плохо переносимы или сложны для программирования на другом языке, например на Cи. Иногда содержимое Perl-программ выглядит для непосвященных как случайный набор символов, но, естественно, он имеет контрольную сумму, а каждый его символ — свое назначение.
Perl распространяется бесплатно, поэтому исходные тексты языка и многие двоичные файлы для использования вне Unix-архитектуры можно получить на одном из серверов сети CPAN (Comprehensive Perl Archive Network) по адресу http://www.perl.com/CPAN или на узле поддержки разработчиков по адресу http://www.basicnet.sonnet.ru/dounload.
Для создания и тестирования Perl-программ необходимы:
любой текстовый редактор, позволяющий сохранять файлы в ASCII-коде (например, встроенный редактор из оболочки FAR Commander);
программа конвертации ACSII-файлов в формат Unix-систем (в частности, редактор Castillo TextEditor, который можно свободно загрузить с сервера www.castillobueno.com);
интерпретатор Perl для отладки (у автора — Win32-версия Perl, доступная по адресу ftp.perl.com/pub/perl);
Web-сервер, поддерживающий работу Perl-программ (для проверки интерфейсных программ был применен Web-сервер OmniHTTPd 2.0 Professional, который можно загрузить с узла компании-разработчика по адресу www.omnicron.ab.ca/httpd);
FTP-клиент для загрузки файлов на сервер (больше всего для этого подходит CuteFTP 2.0, позволяющий устанавливать права доступа к файлам; его можно найти по адресу www.cuteftp.com);
любой Web-браузер (был использован MS IE 4.0).
Программы на языке Perl с расширениями .cgi или .pl должны находиться в специальном каталоге на Web-сервере, обычно называемом CGI-BIN. операционной системы Windows 9.x/NT, то не следует преобразовывать созданные файлы в формат систем Unix. А операционные системы семейства Windows не позволяют выставлять атрибуты доступа подобно Unix-системам — в них используется другая методика.
Структура Perl-программ
Perl-программы очень похожи на написанные на Cи/Cи++, возможно, потому, что сам язык был написан на Cи. Все Perl-программы состоят из операторов, имеющихся в файле и рассматриваемых в совокупности как одна большая программа, подлежащая выполнению. Но понятия «основной» (main) программы, как в языке Си, здесь нет. Комментарием в Perl является все, что следует за «решеткой» (#), вплоть до конца строки. Интерпретатор языка перед выполнением разбирает программу и компилирует в свой внутренний формат. Поэтому после ее запуска невозможно получить сообщение о синтаксической ошибке — это происходит только в процессе отладки программы в командной строке. В результате обеспечивается быстрое выполнение операций языка Perl после запуска.
Для написания программы можно использовать любой текстовый редактор. Так, в Windows это Notepad (Блокнот) или WordPad, в OS/2 — e или epm, в Unix — vi или emacs. Обычно лучшему пониманию языка способствует разбор небольшой программы (см. листинг 1).
Листинг 1. Пример программы на Perl
#!/usr/local/bin/perl @passwords = qw (inet basic net); print ”Enter the login: ”; $login = ; chomp ($login); if ($login eq ”Root”) { print ”Hello, Administrator! Glad to see you again!\n ”; } else { print ”Enter password: ”; $pass = ; chomp ($pass); $i = 0; $flag = ”no”; while ($flag eq ”no”) { if ($passwords[$i] eq $pass) { $flag = ”yes”; } elseif ($i <2) { $i = $i + 1; } else { print ”Incorrect password for $login, try again.\n”; print ”Enter password: ”; $pass = ; chomp ($pass); $i = 0; } } }
Интересной особенностью Perl является то, что программист не объявляет типы применяемых переменных. В первой строке описывается физический путь к выполняемому модулю интерпретатора (например, PERL.EXE), который должен начинаться со знака комментария (#):
#!/usr/local/bin/perl
В рассматриваемом случае массив @passwords включает три элемента: inet, basic, net. Команда qw(), заключающая их в скобки, освобождает от ввода кавычек, необходимого при использовании общепринятой конструкции вида
@passwords = (”inet”, ”basic”, ”net”);
Оператор print служит для вывода на экран символьной информации
print ”Enter the login: ”;
Приведенная ниже конструкция напоминает аналогичную по смыслу на языке Паскаль:
print ”Enter the login: ”; $login = ;
Следовательно, сначала располагается оператор вывода информации (print), а затем оператор ввода строки с терминала, выполняющегося в Perl с помощью считывающей одну строку данных конструкции . Переменная $login содержит и завершающий символ строки, например, Root будет введено как Root\n. Чтобы убрать лишний символ, требуется функция chomp, которая в качестве своего единственного параметра принимает скалярную переменную и удаляет из нее завершающий символ перехода на новую строку, если этот символ там присутствует:
chomp ($login);
Далее используется конструкция if-then-else:
if ($login eq ”Root”) { print ”Hello, Administrator! Glad to see you again!\n”; } else { ... }
Наличие значения переменной $pass среди элементов массива @passwords проверяет $passwords[$i] eq $pass.
Следующая ниже операция сложения
$i = $i + 1;
увеличивает текущее значение счетчика на одну позицию. В строке
print ”Incorrect password for $login, try again.\n”;
между кавычками помещается переменная $login, содержащая вводимое пользователем значение. В других языках программирования значения переменных обычно отделяются от данных. Например, в Basic эта строка будет иметь следующий вид:
print ”Incorrect password for”; login$ ; ” try again.”
Perl оперирует только двумя типами данных — ска
$a = 2; $b = 6; $c = $a . $b; # ”.” — операция конкатенации двух строк $d = $c / 2; print $d; # — результат равен 13
Аналогичный пример для строковых значений выглядит иначе (см. листинг 2).
Листинг 2
#!/usr/local/bin/perl -w # режим отображения # предупреждений # о возможности ошибок $who = ‘Michael Yevdokimov’; $where = ‘Moscow’; $what = ‘in MSATU’; print ”My name is $who,\n”; # представимся print ”I live in $where,\n”, ”I study $what there.\n”; # где учимся print ”\nSigned: \t$who,\n\t\t$where.\n”;
Для ввода скалярного значения используется дескриптор , причем следующая полная строка текста считывается до первого символа новой. Если же текущая строка еще не образована, то Perl останавливается и ждет до тех пор, пока не будут введены информация и вслед за ней символ перехода на новую строку.
Массив — это список скаляров. Название переменных такого типа начинается с символа ‘@’. Каждый элемент массива — это отдельная скалярная переменная, которой можно присваивать значение и затем использовать ее независимо от других. Однако можно присвоить значение и всем элементам массива сразу, например
@passwords = qw(inet basic net);
Проведя такую операцию, затем легко будет обращаться к каждому из скаляров с помощью индексных ссылок. В рассматриваемом примере $passwords[0] имеет значение inet, $passwords[1] — basic, а $passwords[2] — net. В качестве индекса может быть принято выражение, поэтому если присвоить $i значение 1 ($i = 1), то элементом массива $passwords[$i] будет basic. Поскольку каждый элемент массива — скаляр, при адресации ставится знак доллара, а не ‘@’. В отличие от других языков программирования, в массиве на Perl можно объединять скаляры разных типов данных. Если записать
@items = (20, ‘10.00’, ”диск”); print ”Купи мне $items[0] $items[2]ет за \$$items[1].\n”; то в результате получится текст «Купи мне 20 дискет за $10.00.»
Все массивы в языке — динамические. Не нужно беспокоиться о проблемах распределения памяти — интерпретатор все сделает за вас. Кроме того, массивы могут содержать подмассивы, поэтому можно создать подобную структуру:
@A = (1, 2, 3); @B = (4, 5, 6); @C = (7, 8, 9); @D = (@A, @B, @C);
Результирующий массив D будет содержать числовые значения от 1 до 9.
Большинство встроенных функций в Perl используют массивы как аргументы, например sort и join. Первая возвращает массив, но уже в отсортированном виде. Результатом операции
print sort (‘Beta’,’Gamma’,’Alpha’);
будет последовательность AlphaBetaGamma. Функция join имеет два входных параметра — строку и массив строк. Она возвращает строку, которая состоит из всех элементов массива, разделенных значением входной строки, т. е.
print join (‘:’,’Name’,’Address’,’Phone’);
и выдает на печать Name : Address : Phone.
Может возникнуть вопрос, как добавить к уже существующему массиву какой-нибудь элемент, не создавая при этом дополнительный массив. Так, массив @letters содержит элементы Beta, Gamma и Alpha. Если в него нужно добавить значение Tetta, то следует использовать возможности функции push (см. листинг 3).
Листинг 3
@b = (”Beta”, ”Gamma”, ”Alpha”); push @b, ”Tetta”; # добавим в массив @b новый элемент @w = sort @b; # отсортируем массив @b по алфавиту $c=0; # инициализируем переменную $c foreach (@w) { print ”$w[$c]\n”; # выведем отсортированные значения $c++; }
Как ранее указывалось, дескриптор возвращает в скалярном виде значение введенной строки. Примененный же к массиву, он каждому его отдельному элементу, вплоть до конца файла, присваивает значение очередной строки. Таким образом, если при выполнении программы ввести три строки и операцию конца файла [Ctrl + Z] или [Ctrl + D], то массив будет состоять из трех элементов, которые являются строками и заканчиваются символами перехода на новую строку.
Ассоциа является «Green», которому будет соответствовать элемент массива «Apple». Для лучшего понимания использования АМ следует сопоставить ключи с ID в таблицах реляционных баз данных, которые представляют собой практически одно и то же. Рассмотрим пример из листинга 4.
Листинг 4
%Folk = (‘BG’, ‘Bill Gates’, ‘MY’, ‘Michael Yevdokimov’, ‘BC’, ‘Bill Clinton’); %State = (‘BG’, ‘California’, ‘MY’, ‘Moscow’, ‘BC’, ‘Washington’ ); %Job = (‘BG’, ‘work in Microsoft’, ‘MY’, ‘write this article’, ‘BC’, ‘work as the President of USA’); foreach $person (‘MY’, ‘BG’, ‘BC’) { print ”My name is $Folk{$person},\n”, ”I live in $State{$person},\n”, ”I $Job{$person} there.\n\n”; }
Содержимое массивов можно представить и в другой форме, например
%Job = (‘BG’ => ‘work in Microsoft’, ‘MY’ => ‘write this article’, ‘BC’ => ‘work as the President of USA’);
Индексы и элементы массива можно заключать как в апострофы, так и в кавычки. Чтобы перебрать все значения АМ, нужно использовать оператор foreach. Он предназначен для организации циклов, как и некоторые другие, в частности while. Можно обращаться к ключам и значениям с помощью операторов keys и values.
Специальный ассоциативный массив %ENV хранит содержимое всех переменных, индексированных по имени. Так, $ENV{‘PATH’} возвращает текущее значение пути поиска. Существует также функция each, приводящая список, который состоит из двух элементов — ключа и значения. При каждом следующем вызове она возвращает новую пару, к примеру
while (($key,$value) = each %ENV) { print ”$key = $value\n”; }
Работа с файлами и каталогами
Для нормальной работы в Perl с файлами и каталогами следует запомнить несколько важных процедур (см. таблицу).
Дескриптор представляет собой особый вид символьных переменных (literal string). Дескрипторы файлов, так же как и метки, применяются без специального префиксного символа, поэтому их можно спутать с существующими или зарезервированными словами (для подпрограмм, команд и пр.). При программировании названия дескрипторов рекомендуется писать только прописными буквами. Во-первых, они легко различимы среди остального текста, во-вторых, благодаря этому программа будет правильно выполняться. Дескриптор обычно представляет собой «название» файла, на который ссылается пользователь. Как и при программировании на Basic, Паскале или Cи/Cи++, дескрипторы в Perl подобны переменным, присутствующим в синтаксисе операций открытия, закрытия, считывания или записи в файл. Подобно другим языкам, Perl также использует дескрипторы в операциях манипулирования содержимым файлов. Однако есть и другие варианты их применения.
Существует три разных способа открытия файла для проведения чтения (read), дополнения (append) и записи (write).
Режим чтения (Read) — самый простой. Синтаксис операции open следующий:
open (HANDLE,”filename.txt”);
Оператор open используется для открытия файла. В круглых скобках заключен дескриптор файла HANDLE. В дальнейшем при выполнении операций над файлом filename.txt и его содержимым на него будут приведены ссылки в программе. В кавычках стоит имя файла.
Для считывания информации из файла выполняется так называемая операция ромба, обозначаемая символами (<>):
open (HANDLE,”filename.txt”); while () { # Этот цикл будет считывать информацию из файла построчно }
Режим записи (Write) имеет следующий вид:
open (HANDLE,”>filename.txt”);
Отличие синтаксиса операций записи от синтаксиса чтения заключается лишь в том, что перед именем файла стоит символ «больше чем» (>). Этот знак сообщает, что следует создать указанный в кавычках файл и записать или обновить (если он уже существует) его содержимое. Чтобы записать в него информацию, нужно обратиться к помощи оператора print:
open (HANDLE,”>filename.txt”); print HANDLE ”Записать этот текст в файл...”;
Режим до попытке открыть файл для чтения выдается значение false, то это означает, что файла нет или доступ к нему запрещен. А когда при открытии файла для ввода информации это значение возвращается, то можно сделать вывод, что либо файл защищен от записи, либо невозможна запись в каталог или доступ к нему. Если затем программа завершит свою работу или файл заново откроется, то не нужно закрывать его после окончания работы с дескриптором — операция открытия файла закрывает ранее задействованный дескриптор. Тем не менее лучше все же закрыть файл с помощью операции close. Подобная структура является «хорошим тоном» при программировании:
close (HANDLE);
Отладка. Всякий раз при открытии файла разумно использовать вместе с оператором open оператор die. Бывает, что файл по какой-то причине нельзя правильно открыть. Программа вроде бы выполнилась, как требовалось, а в файл записалось вовсе не то, что ожидалось. В подобном случае оператор die прерывает выполнение программы и выдает сообщение об ошибке при открытии файла.
В синтаксисе совмещения open и die используется «логическое ИЛИ» ():
open (HANDLE,”>>filename.txt”) die ”Ошибка добавления в файл filename.txt $!\n”;
Функция die, название которой можно перевести с английского как «откройся или умри», прерывает выполнение программы. Выдается сообщение об ошибке, а также информация о том, что ее вызвало. Perl сохраняет сведения о последней системной ошибке в специальной переменной $!. Если после функции die вставить $!, то от ОС будут получены дополнительные данные, которые помогут отладить программу.
Проверка файлов. Теперь можно открыть дескриптор файла для записи, уничтожив имеющийся файл с таким же именем. Но для этого сначала нужно проверить, существует ли файл с таким именем, чтобы не стереть какую-либо важную информацию. При этом следует использовать следующую конструкцию:
$filename = ”filename.txt”; if (-e $filename) { print ”Файл $filename уже существует\n”; } else { print ”Файл $filename не найден\n”; }
И для нескольких файлов можно за один раз выяснить, существуют ли они, просто уничтожив первую строку предыдущего примера и заменив вторую конструкцией
if (-e ”filename.001” && -e ”filename.002”) {
Есть множество других операций для проверки файлов. Например, чтобы убедиться в наличии какого-либо файла и возможности чтения из него, нужно вместо операции -e выполнить -r, а в случае требования возможности записи —w. Можно проверить один и тот же файл на доступность чтения и записи информации, выполнив следующее:
$filename = ; chomp ($filename);# убрать символ новой строки if (-r $filename && -w $filename) { # файл существует, мы можем читать из него # и записывать в него . . . }
Чтобы определить возможность чтения для целой группы файлов с одинаковым расширением, можно использовать конструкцию:
@files = <*.txt>; foreach (@files) { print ”$_ is readable\n” if -r; }
При большинстве подобных проверок, а их около 20, возвращается значение true или false.
Отличия от Win32. При работе на Perl под управлением Windows существуют некоторые нюансы, о которых следует знать. Во-первых, нужно указывать полный путь к файлу (вместе с именем диска), над которым будут выполняться какие-либо действия, например
open (HANDLE,”c:/scripts/newfile.txt”) die ”Error opening c:/scripts/newfile.txt $!\n”; ... close (HANDLE);
Во-вторых, блокировка файла происходит иначе, чем в Unix-системах. При использовании Windows 9.x эта операция вообще не поддерживается, а в Windows NT выполняется весьма своеобразно — перед выполнением команд копирования или изменения имени файла нужно удостовериться, что вы уже закрыли его. Иначе они просто не выполнятся.
ОБ АВТОРЕ
Михаил Евдокимов — программист, координатор проекта Developers Support Site; е-mail: flanker@sonnet.ru; http://www.basicnet.sonnet.ru
Что можно делать с помощью cookie?
Сами по себе cookies не могут делать ничего, это только лишь некотораяинформация. Однако, сервер может на содержащуюся в cookies информацию.
Например, в случае авторизованного доступа к чему либо через WWW,
в cookies сохраняется login и password в течение сессии, что позволяет
не вводить их при запросе каждого запаролированного документа.
Другой пример: cookies могут использоваться для построения персонализированных
страниц. Чаще всего встречается такое - на некотором сервере Вас
просят ввести свое имя, и каждый раз, когда Вы заходите на первую
страницу этого сервера, Вам пишут что-то типа "Hello, your_name!".
На использовании cookies также часто строят функцию оформления
заказа в онлайновых магазинах, в частности, в Амазоне, такая своеобразная
виртуальная корзина покупателя, как в обычном реальном супермаркете.
Что такое cookie?
Cookie является решением одной из наследственных проблем HTTPспецификации. Эта проблема заключается в непостоянстве соединения
между клиентом и сервером, как при FTP или Telnet сессии, т.е.
для каждого документа (или файла) при передаче по HTTP протоколу
посылается отдельный запрос. Включение cookie в HTTP протокол
дало частичное решение этой проблемы.
Cookie это небольшая порция информации, которую сервер передает
клиенту. Клиент (броузер) будет хранить эту информацию и передавать
ее серверу с каждым запросом как часть HTTP заголовка. Некоторые
cookie хранятся только в течение одной сессии, они удаляются после
закрытия броузера. Другие, установленные на некоторый период времени,
записываются в файл. Обычно этот файл называется 'cookie.txt'.
Что такое файловые манипуляторы, и с чем их едят
Доступ к файлам осуществляется с помощью файловых манипуляторов, которые представляют собой так сказать синоним файла. Они не являются переменными, а поэтому их нельзя непосредственно присваивать другим переменным или передавать в функции (для этого нужно, что называется, пойти другим путем).Есть и стандартные Перловские файловые манипуляторы. Они называются STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (стандартный поток ошибок). Например параметры скрипту из формы передаются именно через STDIN (при условии использования метода POST).
Если понадобится создать копию файлового манипулятора (не файла, а только манипулятора по которому осуществляется доступ к файлу), то можно воспользоваться функцией open (о ней подробнее поговорим позже).
Пример: open(FILL,"file.txt"); open(FAIL,"
О присваивании переменным файловых манипуляторов:
$handle=*FILL; или передать его в функцию: some_sub(*FILL);
И под конец скажу, что файловые манипуляторы в Perl используются не только для связи с, собственно, файлом. Они могут быть связаны с каким-нибудь процессом, сокетом и т.д. Но это не входит в тематику статьи.
Data Bases
Q: Как работать из perl с базами данных?A: DBI. Это унифицированный программный интерфейс, придуманный для того, чтобы
с разными базами можно было работать одинаково (за исключением, конечно,
специфики самих SQL-запросов). Устанавливаете модульDBI (Data Base
Interface), ищете и устанавливаете DBD::something (Data Base Driver) -
драйвер-связку между DBI и нужной вам базой. Oracle, MySQL, PostgreSQL и куча
других СУБД поддерживаются DBI+DBD. Читаете perldoc DBI
Доступ к элементам
Проверка хэша на наличие элемента:%hash = (
'шляпа' => 'серая',
'водка' => 'горькая',
'вобла' => 'вкусная');
if(exists($hash{"дождь"})){
print "Элемент найден";
}
else{
print "Элемент не найден";
}
Удалить элемент из хэша можно при помощи функции delete:
%hash = (
'шляпа' => 'серая',
'водка' => 'горькая',
'вобла' => 'вкусная');
delete($hash{"шляпа"});
if(exists($hash{"шляпа"})){
print "Элемент найден";
}
else{
print "Элемент не найден";
}
Функция delete может вызываться для среза хэша, что приводит к удалению всех указанных ключей:
delete @hash{'шляпа','водка','вобла'}; см. perlfunc(1)
Если нужно найти совпадающие ключи или не входящие в другй хэш, то надо организовать перебор ключей хэша при помощи keys и проверять, если ли текущий ключ в другом хэше. Поиск совпадающих ключей:
my @common = ();
foreach(keys %hash1){
push(@common, $_) if exists $hash2{$_};
}
Поиск ключей, отсутствующих в другом хэше:
my @test = ();
foreach(keys %hash1){
push(@test, $_) unless exists $hash2{$_};
}
Если keys вызывается для хэша, ключи которого представляют собой ссылки, то возвращаемые ей ссылки не работают. Ключи преобразуются в строки, т.е. интерпретируются так, словно они заключены в кавычки, при работе со ссылками они теряют свои свойства. После преобразования в строку ссылка имеет вид
Class::Somewhere=HASH(0x72048)
ARRAY(0x72048)
Преобразованную ссылку нельзя вернуть к прежнему виду, т.к. она из ссылки превратилась в строку. Нужно создать специальный хэш, ключами которого являются ссылки, преобразованные в строки, и значениями - настоящие ссылки.Можно воспользоваться модулем Tie::RefHash. Пример показывает использование объектов ввода/вывода для работы с файловыми манипуляторами.
use Tie::RefHash;
use IO::File;
tie %name, "Tie::RefHash";
foreach $filename("/etc/termcamp/", "/vminux", "/bin/cat"){
$fh = IO::File->("<$filename") or next;
$name{$fh} = $filename;
}
print "open files: ", join(", values %name", "\n");
foreach $file(keys %name){
seek($file, 0, 2);
printf("%s is %d bytes long.\n", $name{$file}, $tell{$file});
}
Если в качестве ключа использована неопределенная величина undef, то она преобразуется в пустую строку. undef является вполне допустимым значением в хэше. Но при выборке значения для ключа, отсутствующего в хэше perl выдаст undef. Проверить наличие ключа можно так: exist($hash{$key}); определенность ассоциированного значения: defined($hash{$key}); истинность: if($hash{$key});. Иногда undef нужно сохранять в кэше, т.е. ключ есть, но с ним не связано ничего полезного, например программа, определяющая размер файлов из переданного списка:
%name =();
while(<>){
chomp;
next if exist $name{$_};
$name{$_} = -s $_;
}
Этот код позволяет пропустить несуществующие и нулевые файлы, но записанные в исходном списке.
Хэши с несколькими значениями, ассоциированными одним ключом. Т.к. скалярные величины, содержащиеся в хэше, могут быть ссылками(которые могут быть скалярами), то ассоциировать несколько значений одним ключом можно сохранив в $hash($key) ссылку на массив со значениями, ассоциированными с ключом $key. Операции с хэшами(вставка, удаление, перебор и проверка существования(undef)) переписываются для операций с массивами(push, splice и foreach). Пример, реализующий вставку в хэш(обрабатывает выходные данные команды who(1) и выводит краткий список пользователей с терминалами, на которых они зарегестрированы):
%ttys=();
open (WHO, "who|");
while(){
($user, $tty) = split;
push(@ {$ttys{$user}}, $tty);
}
foreach $user (sort keys %ttys){
print "$user: @{$ttys{$user}}\n"
}
в строке push содержится версия $tty{$user} = $tty для многозначного хэша. Все имена терминалов интерполируются в строке print @{$ttys{$user}}.
Пример программы, которая на название предмета выдает его свойство и наоборот:
#!/usr/bin/perl -w
$vziat = shift @ARGV or die $!;
%svojstvo = (
"malina" => "vkusnaia",
"svekla" => "krasnaya",
"kozmodrom" => "nebolshoy",
"magazin" => "dvuhetagnij");
%predmet = reverse %svojstvo;
if (exists $svojstvo{$vziat}){print "$vziat," ", $svojstvo{$vziat}\n";}
elsif (exists $predmet{$vziat}){print "$vziat," ", $predmet{$vziat}\n";}
например если ввести в терминале:
bash-2.03$ ./1.pl malina
то скрипт выдаст:
malina vkusnaia
или
bash-2.03$ ./1.pl vkusnaia
vkusnaia malina
В чем различие delete и undef для хешей?
Хеши являются парами скаляров, первый - ключ, второй значение.
Ключ может быть строкой, в то время как значением хеша может
быть любой вид скаляра: строка, число или ссылка. Если ключ
содержится в хеше, то exists($key) возвратит истину. Значение для
какого-то конкретного ключа может быть undef'ом, и $array{$key}
возвратит так-же undef, но exists($key) возвратит истину.
Иными словами в хеше может быть реализована связка ('$key', 'undef')
В качестве примера можно привести следующую таблицу %ary:
keys values
+------+------+
| a | 3 |
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+
Этот хеш выглядит примерное так:
$ary{'a'} true
$ary{'d'} false
defined $ary{'d'} true
defined $ary{'a'} true
exists $ary{'a'} true (perl5 only)
grep ($_ eq 'a', keys %ary) true
Если теперь сказать
undef $ary{'a'}
То таблица будет читаться следующим образом:
keys values
+------+------+
| a | undef|
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+
И теперь логические состояния в хеше уже немного другие,
изменения показаны регистром
$ary{'a'} FALSE
$ary{'d'} false
defined $ary{'d'} true
defined $ary{'a'} FALSE
exists $ary{'a'} true (perl5 only)
grep ($_ eq 'a', keys %ary) is true
Отсюда следует вывод, что можно держать значение undef'ом,
но ключ всегда должен быть определен.
Теперь рассмотрим операцию удаления элемента из хеша:
delete $ary{'a'}
после этого таблица будет выглядеть так:
keys values
+------+------+
| x | 7 |
| d | 0 |
| e | 2 |
+------+------+
Состояния элементов в хеше уже другие,
изменения показаны, как и в предыдущем примере, различающимся регистром.
$ary{'a'} is false
$ary{'d'} is false
defined $ary{'d'} is true
defined $ary{'a'} is false
exists $ary{'a'} is FALSE (perl5 only)
grep ($_ eq 'a', keys %ary) is FALSE
from:
A: Воспользоваться утилитой sendmail (есть на всех unix системах)
Пример:
open MAIL, '|/path/to/your/sendmail -t';
print MAIL "From: mail@my.host\n",
"To: webmaster@my.host\n",
"Subject: Mail from perl script!\n\n",
$message;
close MAIL;
Q: Sendmail это хорошо, а как из под виндов?
A: Есть sendmail под винды, платный, бесплатный и даже от M$.
Q: Как послать по e-mail письмо с аттачем?
A: rfc2045, rfc2046, perldoc Mime::Lite
Q: Можно ли проверить, существует ли определенный e-mail адрес?
A: В общем случае - нельзя. Проверка существования и функционирования домена,
в котором этот email прописан, в сущности ничего не дает. Остается
отталкиваться от конкретных требований. Hапример, послать e-mail на этот адрес
и попросить ответить, проверив ответ.
Функции, использующие регулярные выражения
Фактически, есть три функции, которые в качестве разделителя могут использовать регулярные выражение: split, grep, map и еще можно воспользоваться специальными операторами ... и .. и используемыми совместно с ними условиями if, unless и просто логическими операторами.Где ставить cgi скрипты?
На своем сервере, надо чтобы он поддерживал CGI, кроме того, узнайте полный путь к папке cgi-bin (что-то типа "home/home-webservis/kakadu/public_html/cgi-bin" не путайте это с URL, в приведенном случае, URL папки CGI будет выглядеть обычно, т.е. примерно так: http://kakadu.al.ru/cgi-bin) - обо всем этом вы сможете прочитать в FAQ вашего хостинга, посмотрите путь к почтовой папке (например /usr/sbin/sendmail), и ГЛАВНОЕ, узнайте путь к Perl, по умолчанию считается #!/usr/bin/perl, но могут быть вариации… "Где взять скрипты?
Надеюсь, что все любители отвечать на этот вопрос примерно так: "Потратить часок-другой и написать самому!" уже давно прекратили чтение этой статьи, а оставшиеся, как и я, довольно смутно представляют себя в роли программиста… Не унывайте! Я уже говорил в начале статьи, что существует множество бесплатных скриптов и я не соврал! Более того, таких скриптов очень много, конечно они довольно часто уступают по возможностям скриптам платным, но, к счастью, из-за большого их количества часто удается подобрать то, что нужно. Вот несколько наиболее интересных, на мой взгляд, ссылок на скриптовые ресурсы:1. - мне действительно нравится этот каталог! На первый взгляд, скриптов тут не очень-то и много (всего пару сотен), но должен признать, что тут подобраны наиболее интересные и популярные скрипты, существующие в Сети. Да и сайт русскоязычный, что для многих весьма важно.
2. - а вот это мировой гигант, собравший не только perl cgi скрипты, но и скрипты, написанные на языках C/C++, Python, есть там и PHP скрипты, и Java, и DHTML… Вам же следует пройти в раздел Perl (большинство скриптов написано на этом языке) , после чего вы сможете лицезреть несколько тысяч скриптов! Там перечислены не только бесплатные, но и платные скрипты (но об этом там написано, думаю, что слово "Free!" никто не пропустит). Все скрипты довольно удачно разбиты по категориям, и там нетрудно найти то, что надо. Всем рекомендую!
Есть и еще множество каталогов скриптов, но, мне кажется, они все уступают HotScripts.com или WebScript.ru (если говорить о русскоязычных ресурсах), как по подборке скриптов, так и по удобству пользования сайтом. Среди достойных внимания назову еще :
The CGI Resource Index () - весьма нравился мне, пока я не нашел Hotscripts.com
CGI City ( ) - не самая удобная навигация, но попадаются довольно интересные скрипты.
FreePerlCode ( ) - Как и следует из названия, здесь вы можете получить CGI PERL скрипты - они бесплатные, их можно скачать.
КОНЕЦ!
Green Kakadu, прямая трансляция с сайта Гнездо: каталог для вебмастеров [].
P.S. Все испробовал на себе - при проведении эксперимента пострадал только один Kakadu, т.е. Я! Исход, к счастью, не смертельный. Пишите письма!
[ Распечатать ]::[ ]::[ ]
Генерация ответа
Большую часть того что нужно знать о генерации ответа,я сказал в разделе .Нет,не угадали! Я не буду сдесь говорить о всяком дизайне того что вы выдаете.Этому вы успели напрактиковатся на HTML -страничках.Я поговорю о MIME (Multipurpose Internet Mail Extension).И о разных браузерах.
Стандарт MIME появился в электронной почте (e-mail) потому что остро стала проблемма пересылки по e-mail различных данных в различных форматах.Так как HTTP тоже работает с различными типами данных то поэтому тоже использует MIME для своих нужд. Типы MIME состоят из Типа и подтипа (например text/plain,где text-указывает на наличие текстового содержимого,а plain-уточняет его как простой текст) приведеный ниже список (он далеко не полн,типов MIME огромное количество) описывает некоторые часто встречающиеся типы.: text/html text/plain text/richtext image/gif image/jpeg image/tiff audio/basic audio/32kadpcm audio/ video/mpeg video/quicktime multipart/mixed multipart/alternate multipart/ application/octet-stream application/msword application/postscript message/digest
Информация о MIME больше возможно пригодится вам в том случае если вы собираетесь работать из ваших скриптов с электронной почтой,но и для WWW она не повредит. Онобенно знание Content-Type:
Content-Type:
Состоит из типа и подтипа типы могут быть как стандартные так и экспериментальные начинающиеся с префикса 'x-':
text
Текстовые данные.Первым подтипом который включен сюда это plain,что значит простой текст. сюда же включен самый ходовой формат html .У типа text как и у многих типов могут быть параметры,главным из них является charset он как раз и указывает на раскладку символов, которая применена в тексте, так что если вы хотите указать браузеру какую раскладку применять, то просто укажите charset:
Content-Type: text/plain; charset=us-ascii
Content-Type: text/html; charset=iso-8859-1
Content-Type: text/html; charset=koi8-r
multipart
Данные которые могут состоять из нескольких частей,различных типов данных.Поэтому параметром multipart служит boundary, позволяюший указать разделитель.Каждый фрагмент в многочастевом сообщении имеет свой Content-Type: (Он может быть также multipart,т.е. допускаются вложеные multipart,главное чтоб boundary были разными).В электронной почте применяется больше multipart/mixed (основной подтип) и multipart/alternative (Он отличается тем что показывается одна из альтернатив,например сообщение шлется в простом и HTMLом форматах,и почтовая программа показывает либо часть,которую она способна отобразить). В WWW -програмировании распостранен x-mixed-replace ,который означает что следующая часть должна заменить предыдущую после подгрузки, что применяется для анимации(см.Пример с анимацией).
Теперь о разделителе,его надо выбирать так,чтоб он не встретился где-то в данных (т.е. что-то вроде "diUr344rnmvforgefvrg923rghyj2").Когда вы задали разделитель,например boundary="boundary" то когда закончилась одна часть,вы должны выдать строку --boundary,последняя часть --boundary--, причем эти разделители должны быть на отдельной строке,а не сливаться с текстом:
Пример:
MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="w23renff491nc4rth56u34-9449"
--w23renff491nc4rth56u34-9449 Content-Type: text/plain; charset="koi8-r"
Hello,World!! --w23renff491nc4rth56u34-9449 Content-Type: text/html; charset="us-ascii"
Hello,Word!!
Hello people! --w23renff491nc4rth56u34-9449--
message
Представляет инкапсулированое почтовое сообщение.Используется в e-mail ,а не в WWW.
image
Некоторое Графическое изображение.(чаще всего image/gif и image/jpeg)
audio
Аудиоданные.
video
Видеоданные.
application
бинарные данные какого-нибудь приложения.В том случае если данное приложение может быть запущено,Браузер запускает его.Например при поступлении данных application/msword Браузер спросит,нужно ли запустить Word для просмотра досумента.При отсутствии нужного приложения браузер спросит в каком файле сохранить данные.Подтип octet-stream как раз и означает поток байт информации,который и используется по умолчанию.(К сожалению не все так гладко,известен глюк в Netscape Navigator'е который вместо того чтоб сохранить application/octet-stream
пытается его показать как text/plain что если это сгенерировано из CGI,ни к чему хорошему не приводит ;(()
Что касается application ,то Вы можете тут смело извращатся,используя x- типы данных,
Например application/x-fuck-to-netscape-navigator. ;)))))
Часто используемый параметр name позволяет указать имя файла.Например:
Content-Type: application/msword; name="readme.doc"
Что полезно при полученнии файлов через HTTP,причем этот параметр может применятся и для других типов таких image или audio ,Например:
Content-Type: image/gif; name="myfoto.gif"
Content-Transfer-Encoding:
Применяется больше в системе электронной почты и обозначает метод кодирования, которым были закодированы данные при передаче сообщения.Например:
7bit 8bit quoted-printable base64 binary x-типы
MIME-Version:
Указывает версию MIME .
Теперь поговорим о разных браузерах вы знаете что браузеры бывают разные,разных версий на разных платформах, поддерживают и не разные тэги и глюки у них тоже разные.....;((( .
Это могло попортить много нервов WEB-дизайнерам и конечно же нам ,CGI-програмистам. Профессионально написаный сайт от просто хорошего отличается тем что хорошо выглядит Не только на экране того браузера,которым пользуется сам его автор,а на других тоже.
Если вы используете JavaScript для своих страничек,то вы уже наверно использовали (или хотя бы вам в голову приходила мысль использовать)свойства navigator.AppName navigator.AppCodeName navigator.appVersion navigator.userAgent:
или