Скрипт новостной ленты с загрузкой файлов. Cвоя новостная лента на PHP
Предисловие, на наш взгляд, должно дать читателю информацию, на основании которой он решает, нужна ли ему эта книга.
О чем наша книга. Она, естественно, о языке Perl, потому что так заявлено в названии. Кому он нужен, этот Perl? Тем, кто создает CGI-сценарии, занимается администрированием системы при помощи написания скриптов, а не щелкая левой кнопкой мыши, обрабатывает тексты, решает многие другие задачи из смежных областей и при этом нуждается в мощном, но простом в применении средстве, позволяющем создавать большие программы и маленькие программки и быстро их опробовать. Тем, кто преподает программирование, тоже полезно иметь представление об этом языке, так как он обладает интересными свойствами, отсутствующими в традиционных языках программирования, используемых в процессе обучения.
Нам нравятся некоторые особенности языка: зависимость результата от контекста, ассоциативные массивы, тип данных typeglob, пакеты, реализация объектно-ориентированного программирования и, конечно, средства обработки текста. Если вам не интересно хотя бы узнать, что все это означает, то можете книгу отложить. Если все перечисленное вам уже известно, то тоже можете ее отложить, потому что эта книга для тех читателей, кто еще только начинает изучать Perl самостоятельно.
Язык Perl создан системным программистом Ларри Уоллом (Larry Wall) как средство UNIX, позволяющее «склеивать» из программок, выполняющих отдельные функции, большие сценарии для решения комплекса задач, связанных с администрированием, обработкой текста и т. д. В дальнейшем он вышел за эти рамки, превратился в настоящий язык программирования, в котором нашли отражение многие тенденции, обозначившиеся в технологии программирования за последнее десятилетие, и получил широкое распространение в связи с развитием Inernet. Perl является основным средством создания приложений CGI, удобен для решения задач администрирования Web-серверов, электронной почты и других систем. Благодаря быстроте и легкости написания сценариев на этом языке он распространился и на другие платформы: DOS, Windows, OS/2, Mac, VMS и пр. Одно из основных достоинств языка Perl - его открытость и доступность. В сети Internet можно получить совершенно бесплатно исходные тексты интерпретатора perl (язык Perl - интерпретируемый, что в некоторых случаях является преимуществом) и модулей его расширения.
Данная книга - самоучитель языка Perl, который изучается, что называется, с нуля, т. е. предполагается, что читатель не знаком с этим языком - все необходимое он узнает, последовательно изучив темы и закрепив пройденный материал, отвечая на вопросы и выполняя упражнения, приведенные в конце каждой главы. Повторим, что предлагаемый материал представляет всего лишь основы языка Perl. Наша книга ни в коей мере не претендует на учебник по программированию на языке Perl. В ней вы не найдете методологию программирования или готовые рецепты решения задач, в ней нет подробного описания наиболее часто используемых модулей и решения задач с их помощью, но, прочитав книгу, вы приобретете базовые знания, которые позволят разобраться в любом сценарии Perl.
Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал WEB-сервером, а я, соответственно, WEB-мастером. Учиться принято на чужих ошибках и опыте, поэтому предлагаю Вашему вниманию свой опыт изучения Перла.
Сразу нужно пояснить, для кого это все написано. Если Ваш сервер работает на платформе UNIX, то это я должен читать Вашу статью. У меня же установлен Windows NT workstation 4.0 (RUS) плюс Service Pack 3. Когда пришло время сделать из компьютера WEB-сервер, я было кинулся ко встроенным Службам узла WEB, но быстро понял, что это мне не нравится (почему?). И тут один добрый человек посоветовал поставить Xitami WEB Server от iMatix Corporation (http://www.imatix.com/), который и стоит по сей день.
Что касается самого Перла, то здесь несколько сложнее. Покопавшись по различным Перловым серверам (www.perl.org , www.perl.com) я узнал, что версий Перла настолько много, что выбрать что-нибудь конкретное довольно сложно. При этом каких-нибудь вразумительных рекомендаций по поводу выбора той или иной версии нигде нет. Перепробовав почти все версии для Windows, я остановил свой выбор на Active Perl (http://www.activestate.com/).
Человеку, избалованному всякими Виндовозами и Дельфями, писать программы на Перл довольно непривычно, поэтому настоятельно рекомендую сразу установить Perl Builder. Взять его можно на www.solutionsoft.com. Там лежала тридцатидневная Демо версия.
Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:
- получает данные
- обрабатывает данные
- выдает результаты
Передать данные скрипту можно двумя методами - GET и POST. Разница между ними в том, что при использовании GET данные постоянно болтаются в строке адреса браузера, напимер:
Httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta
В этом случае скрипт B_price.pl берет данные в переменной окружения QUERY-STRING.
$data=$ENV{"QUERY_STRING"};
При использовании метода POST данные передаются на стандартный вход скрипта. Длинна блока данных берется в переменной CONTENT_LENGTH:
Read(STDIN,$data,$ENV{"CONTENT_LENGTH"});
Теперь эти данные нужно перевести в удобоваримый вид, поскольку они закодированы.
Стандартным соглашением служит замена пробелов знаками плюс и затем кодировка оставшихся недопустимых символов с помощью ASCII-кодов в шестнадцатиричной форме, перед которыми ставится знак (%). Пример:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3
Это значит:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=Видео&Description=абвг
Декодировать строку запросов в первый раз лучше самому. На вопрос "а как?" есть множество ответов, переписывать которые нет смысла. Приведу лишь короткий пример:
Заменяем знаки (+) на пробелы
$query = ~ s/\+/ /g;
Потом заменяем все сочетания знака (%), после которого следуют шестнадцатиричные цифры, на соответствующий символ ASCII
$query =~ s/%({2})/pack("C", hex($1))/eg;
Я пользуюсь тем, что предлагает Perl Builder:
#! E:\perl5\bin\perl &GetFormInput; # вызов подпрограммы получения данных $Category = $field{"Category"}; # получаем данные из поля Category $Description = $field{"Description"}; # получаем данные из поля Description $Page = $field{"Page"}; # получаем данные из поля Page
В конце скрипта помещаем подпрограмму "прозрачного" чтения данных.
Sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{"REQUEST_METHOD"} eq "POST") { read(STDIN,$buf,$ENV{"CONTENT_LENGTH"}); } else { $buf=$ENV{"QUERY_STRING"}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }
Второй этап работы скрипта - обработка данных - полностью на Ваше усмотрение. Проверяйте полученные данные на правильность, пишите их в файл, делайте что хотите.
И, наконец, Вам нужно выдать какие-то результаты броузеру клиента, причем так, чтобы броузер правильно их отобразил. То есть, выдавать результаты нужно в HTML. Это делается просто: (тоже можно по-разному)
Print "Content-type: text/html", "/n/n"; #обязательная строка print "
В поле Category Вы ввели: ", $Category, "
Все это касается скриптов, получающих данные из формы на странице HTML. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:
- При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
- Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.
#! E:\perl5\bin\perl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # генерируем страницу с формой } else {# получаем данные, обрабатываем и выдаем результат}
Гостевая книга |
---|
Общий алгоритм работы гостевой книги таков:
1. Если посетитель хочет сделать
запись в книгу, то
1.1 Получаем данные
1.2 Записываем их в файл или в базу данных
1.3 Говорим спасибо на HTML и предлагаем
почитать другие записи
2. Если посетитель хочет почитать записи в
книге, то
2.1 Читаем записи из файла или из базы данных
2.2 Выводим их красиво в HTML
Для удобства восприятия я оформил пункты 1 и 2 отдельными скриптами add_guestbook.pl и read_guestbook.pl соответственно. Сообщения гостевой книги хранятся в текстовом файле построчно, т.е. на каждую запись - строка. Так сделано для удобства чтения этого файла. Пример одной записи:
Sat Dec 5 13:31:20 1998&Наташа&студентка&Good&Для начала хорошо. Успехов на данном поприще Вам, Александр!&нету@пока&194.226.60.34
Вот описание полей
рассматриваемой гостевой книги.
Name - имя, фамилия, отчество, кличка - на
усмотрение посетителя
Work - профессия, род занятий
RadioButton - три кнопки: понравилось (Good), не
понравилось (Bad), пофигу (Different)
Text - text box комментариев и примечаний
Email - обратный адрес
add_guestbook.pl - запись в книгу
#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # Если нет входных данных, то генерируем страницу с формой print <
HTML DoInclude("_menu.htm"); # Это SSI-включение навигационной панели. print <
|
<
|
Вы не указали свое имя, E-mail, либо не заполнили сам текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы и заполните требуемые поля. Назад |
"."\n" ; print " | "; print " | "."\n" ;
print "
"."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print "
| "."\n" ;
print " "."\n" ; print " | Ваши данные"."\n" ; print " приняты. Спасибо. \n" ; print ""; print " | "."\n" ;
print "
"."\n" ; print " |
read_guestbook.pl - чтение книги
#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl open(InFile, "guestbook.txt") || die; # Открываем файл с записями гостевой книги. @lines=HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <
|
Нам пишут:
Так сложилось, что я знаю как минимум двух человек, которые хотели бы выучить Perl. Специально для них я решил написать этот пост.
В нем вы найдете примеры простых программ из серии «вывести числа от 1 до 5» и тому подобное. Мне всегда нравилось учиться на примерах — это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, — велика вероятность, что в них вы найдете еще примеры. Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так — ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh , придется немного погуглить , чтобы это выяснить. Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl , которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:
Дополнение: Также я рекомендую вам ознакомиться со статьями Perl vs Python vs Ruby vs PHP и Жрецы программирования . Первая повествует о производительности различных скриптовых языков, вторая — об отличии PHP от других ЯП. Фанатам Пайтона советую прочитать заметку Тест производительности скриптов на Python . Надеюсь, что эти материалы помогут вам найти ответ на вопрос «чем хорош Perl». Привет, %username%!Итак, давайте уже напишем наш первый скрипт на Perl! #!/usr/bin/perl $name
=
shift
()
;
Запускаем скрипт: $ chmod
u+x 1
.pl Тут все очень просто:
Если пока не очень понятно — ничего страшного. Возможно, немного теории внесет чуть больше ясности. Типы переменныхВ Perl существует три основных типа переменных: скаляры (числа и строки), массивы — подобно тем, что используются в Pascal или C (иногда массивы еще называют векторами), и хэши (ассоциативные массивы). Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров. #!/usr/bin/perl $a
=
123
;
$str1
=
"hello"
;
Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень: $a = 2 ** 8 ; # результат: 256 Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\"), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд. Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто: $int1
=
"11"
+
22
;
Правила преобразования из строки в число и наоборот тут те же, что и в PHP: $str1
=
0
.
"abc"
;
Кстати, для объявления длинных строк существуют специальные операторы — q и qq: # аналогично одинарным кавычкам
Работа с массивами происходит следующим образом: #!/usr/bin/perl $scalar
=
"bebebebe"
;
Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8). Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично. Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить. Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw: @arr
=
qw/aaa bbb ccc/
;
Хэши похожи на массивы, но элементы в хэше не упорядочены. При этом в качестве ключа, по которому производится доступ к элементу, могут использоваться строки. #!/usr/bin/perl %hash
=
( # при объявлении хэшей и массивов можно
$hash
{
"x"
}
++;
# координата по x теперь равна 13
# выводим координаты
Имена хэшей начинаются со знака процента, для обращения к элементу используются фигурные скобки (а не квадратные, как в случае с массивами). Если имя ключа заранее известно, можно указывать его без кавычек (строка 10). Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа. В этом месте я хотел перейти к условным операторам и циклам for/while, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:
Об этом я напишу в одной из следующих заметок. Хотелось бы получить хотя бы парочку комментариев на этот пост — интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) — смело задавайте их в комментариях! Надеюсь, серия постов о программировании на Perl поможет вам написать ваши первые простенькие скрипты. Со временем скрипты будут становится сложнее, в них станут использоваться новые технологии (ООП, регулярные выражения) и через какое-то время вы обнаружите, что знаете о Perl достаточно, чтобы делиться опытом с другими. Вам предстоит путешествие в мир программирования на языке Perl. Ваше путешествие будет тем более приятным из-за присутствия большого количества примеров, которые будут встречаться по ходу. Начало нашего путешествия охватывает основные концепции языка. Постепенно вы узнаете о Perl достаточно, чтобы создавать небольшие программы. В конце нашего путешествия вы уже будете обладать необходимым запасом знаний, чтобы уметь создавать полноценные приложения. Вы владеете какими-либо другими языками программирования? Если да, то изучение Perl будет для вас просто удовольствием. Если же нет, то не спешите, пробуйте все предлагаемые упражнения и примеры и не бойтесь экспериментировать! ПроисхождениеPerl появился в результате деятельности одного человека, и, по его собственному признанию, в результате его лени. Это - уникальный язык, суть которого невозможно передать простым описанием технических деталей. Perl - это состояние мышления. Одна из причуд языка - его название. Оно имеет несколько определений. Первоначально Perl означал Practical Extraction Report Language (практический язык извлечений и отчетов). Однако, программисты очень часто называют его Phatologically Eclectic Rubbish Lister или даже Practically Everything Really Likable. Давайте посвятим несколько минут тому, чтобы разобраться, что представляет собой Perl, и какие задачи возлагались на него во времена его создания. В далеком 1986 году Larry Wall работал над задачей генерирования отчетов из большого количества текстовых файлов, пересекающихся друг с другом. Будучи Unix-программистом, а также, потому что задача включала в себя манипулирование содержанием текстовых файлов, он первым делом попытался использовать Awk. Но вскоре стало ясно, что Awk для работы не подходит, и, не имея других кандидатов для решения поставленной задачи, оставалось только изобретать свой собственный инструмент, который можно было бы использовать и в будущем. Вместо того чтобы впустую тратить время, Larry просто изобрел новый язык программирования и написал интерпретатор для него. Это похоже на парадокс, но это не совсем так, - то, что вы делаете - это всегда большой труд, но если вы сделаете это правильно, то этот труд обязательно окупится. Вскоре Larry предложил свое детище сообществу читателей материалов телеконференций Usenet. Пользователи, имеющие доступ к Usenet, обеспечили создателю Perl эффективную "обратную поддержку", спрашивая, как делать одно, другое, третье. Многие из этих задач Larry даже и не собирался ставить перед своим маленьким новым языком программирования. Новый язык программирования имел акцент на управление системой и обработку текста. После нескольких пересмотров он уже мог использовать регулярные выражения, сигналы, а также сетевые сокеты. Он стал известен как Perl и очень быстро сделался популярным в среде Unix-программистов, а вскоре и у всех нас. Larry уже не сопровождает Perl в одиночку, но сохраняет свой эксклюзивный титул главного разработчика. Perl-программы очень похожи на Си-программы, - возможно, потому что Perl был написан на Си, а, возможно, потому что Larry нашел удобными некоторые конструкции Си. Но Perl менее педантичный и гораздо более лаконичный, чем Си. Perl призван помочь программисту в выполнении рутинных задач, которые для shell слишком трудны или плохо переносимы, а для Си (или любого другого языка) - слишком заумны или сложны в кодировании. Когда вы освоите Perl, вы, возможно, обнаружите, что стали тратить заметно меньше времени на правильное заключение в кавычки различных параметров shell (или на корректное выполнение Си-объявлений), а больше - на чтение Usenet-новостей и катание с гор на лыжах, потому что Perl - замечательное средство для вашего совершенствования как программиста. "Кто-то из древних" сказал: "Не стОит изучать язык программирования, который радикально не меняет вашего представления о программировании". Будьте уверены - изучив Perl, вы посмотрите на программирование с совершенно иной точки зрения. Мощные конструкции этого языка позволяют создавать с минимальной затратой сил очень эффективные решения и универсальные инструменты. Эти инструменты можно использовать и в дальнейшем, потому что написанные на Perl программы отличаются высокой переносимостью и готовностью к использованию. В результате у вас появится еще больше времени для чтения Usenet-новостей и посещения с друзьями баров. Perl очень хорошо умеет обращаться с задачами низкого уровня, особенно после выхода пятой версии языка. Стоимость и лицензияPerl свободен. Если быть более точным - Perl распространяется по открытой лицензии GNU (GNU Public License). Полный исходный код и документация абсолютно свободны для копирования, компилирования и печати. Все программы, написанные вами на Perl - ваши, и вы можете делать с ними все что захотите. Помимо UNIX-компьютеров, Perl также существует для других платформ, - Windows, DOS, Atari, Amiga и.д.
|