Создание серверных приложений на языке PERL

         

Функция Sleep



Функция Sleep

sleep выражение;
sleep;

Приостанавливает работу скрипта на указанное число секунд или зацикливается, если аргумент отсутствует. Работа продолжается, если получен сигнал SIGALARM. Возвращает время фактической паузы.

* * * *



Функция Sort



Функция Sort

sort подпрограмма список;
sort блок список;
sort список;

Сортирует элементы списка и возвращает полученный список. Несуществующие элементы списка отбрасываются. Если не указано имя подпрограммы или блок, то сортирует в стандартном строковом порядке. Указанная подпрограмма возвращает значения больше, меньше или равное нулю в зависимости от двух соседних элементов списка. Имя подпрограммы может быть указано переменной. Она не должна быть рекурсивной, и два сравниваемых элемента списка передаются как глобальные переменные $main::a и $main::b. Это ссылки, поэтому их изменение приводит к изменению самих элементов списка.



Функция Splice





Функция Splice

splice массив, смещение, длина, список;
splice массив, смещение, длина;
splice массив, смещение;

Удаляет элементы массива, начиная со смещения и указанной длины. Заменяет их указанным списком. Возвращает удаленный список. Если длина не указана, удаляет все элементы списка, начиная со смещения



Функция SQRT



Функция SQRT

Возвращает корень квадратный выражения



Функция Srand



Функция Srand

Задает начальное значение для генератора случайных чисел. Если аргумент отсутствует, то используется текущее машинное время.

* * * *

Напишем программу, находящую корни квадратного уравнения:

#!/usr/bin/perl # programm 18 print "Content-type: text/html\n\n"; &parse_form; $a=$FORM{'a'}; $b=$FORM{'b'}; $c=$FORM{'c'}; print X2 + X + = 0
EOF ; sub info(){ $Ds=sqrt($D); print "D = $D, Sqtr(D) = $Ds
\n"; } print "A=$a, B=$b, C=$c

\n"; $D=(($b**2)-4*$a*$c); if ($D0){ info; print "Первый корень: ",((-$b+$Ds)/(2*$a)); print "
\n"; print "Второй корень: ",((-$b-$Ds)/(2*$a)) }

На мой взгляд, это единственная программа, реализованная абсолютно на всех языках программирования.

* * * *

Введите проверку деления на 0 в программе 18.

Напишите программу, которая создает 10 случайных квадратных уравнений и предлагает пользователю выбрать какое из них она будет решать. Диапазон колебания значений a,b,c - (-15..15) включительно, с шагом 1.



Функция Sseekdir



Функция Sseekdir

seekdir директория, позиция;

Установить указатель файла в открытой директории для последующего чтения функцией readdir(). Текущая позиция может быть получена функцией telldir().



Функция Stat



Функция Stat

stat (файл);

Возвращает 13 элементный массив параметров указанного файла или пустой список при ошибке. Применяется обычно следующим образом:

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($filename);

$dev - имя устройства $ino - номер i-узла $mode - права доступа $nlink - количество связей $uid - идентификатор владельца $gid - идентификатор группы $rdev - тип устройства $size - размер файла в байтах $atime - дата последнего обращения $mtime - дата последней модификации $ctime - дата последнего изменения статуса $blksize - размер блока на диске $blocks - количество блоков в файле.

Следующий код выводит размер файла в байтах:

$u = (stat("file.txt"))[7]; print $u; }

Функция Substr



Функция Substr

substr (выражение, смещение, длина);
substr (выражение, смещение);

Возвращает подстроку выражения, начиная со смещения и заданной длины. Если смещение отрицательное, то отсчет ведется от конца строки. Если длина не указана, то берется все до конца строки.



Функция Tell



Функция Tell

tell (файл);

Возвращает текущую позицию указателя в открытом файле. Если файл не указан, то последнего читаемого файла.
Следующий код читает 15 байт из файла "file.txt". Непременное условие работы этого кода - длина файла должна быть более 15 байт.

print ""; open (file, "file.txt"); while (tell(file) < 15){ print getc(file); } print "";

Функция Telldir



Функция Telldir

telldir директория;

Возвращает текущую позицию указателя в открытой директории.



Функция Time



Функция Time

time;

Возвращает количество секунд, начиная с 1 января 1970 г 00:00:00 UTC. Годы не разделяются на високосные.



Функция Times



Функция Times

times;

Возвращает 4-х элементный массив значений:

($user, $system, $cuser, $csystem) = times; $user - пользовательское время процесса в секундах. $system - системное время текущего процесса. $cuser - время процесса-потомка текущего процесса. $csystem - его системное время.

Часто используется для определения времени работы скрипта:

$start = (times)[0]; # помещяем в самое начало скрипта foreach $i(0..200000){ $u+=$i # что-то делаем } $gen_time = (times)[0]-$start; # а это - в конец скрипта. print "Время работы скрипта:"; print "$gen_time секунд.";

Функция Truncate



Функция Truncate

truncate (файл, длина);

Усекает длину указанного файла.
Запишем в файл file.txt строку и усечем его до 15 байт:

#!/usr/bin/perl # programm 15 print "Content-type: text/html\n\n"; $string = "This is a sample file"; print "Write to file: $string
"; open (file,">file.txt"); print file $string; close file; truncate ("file.txt",15); open (file,"file.txt"); $string=; close file; print "Read from file: ",$string;

Функция Uc



Функция Uc

Возвращает строку выражения, в которой малые буквы заменены на заглавные.



Функция Ucfirst



Функция Ucfirst

Возвращает строку выражения, в которой первая буква заменена на заглавную.



Функция Unlink



Функция Unlink

unlink (список)

Удаляет файлы, указанные в списке. Возвращает количество удаленных файлов.

* * * *

Напишем программу, которая создает, переименовывает и удаляет файл delete.me:

#!/usr/bin/perl # programm 14 print "Content-type: text/html\n\n"; unless (-e("delete.me") or -e("undelete")){ open (file,">delete.me") or print "Невозможно создать файл<br>"; close file; rename ("delete.me","undelete") and print "Удачно переименован<br>"; unlink ("undelete") and print "Удачно удален"; } else { print" Невозможно произвести операцию!" }

Я чувствую, что привел Вас в замешательство. Действительно, операторы AND и OR использованы здесь не совсем в "традиционном" контексте.
Вы знаете, чтобы оператор OR вернул истину, необходимо чтобы хотя бы ОДИН из операндов имел значение ИСТИНА. Чего не скажешь об операторе AND. Для того чтобы он вернул истину, необходимо чтобы ОБА операнда являлись истинными. От сюда следует, что если первый операнд возвращает ИСТИНУ, то оператору OR совершенно не обязательно выполнять второе выражение чтобы чтобы ему самому стать истинным. Аналогично с оператором AND. Если первое выражение возвращает ложь, то второе выполнять не обязательно, т.к. независимо от его значения, AND всё равно вернет ЛОЖЬ.

Разберем работу AND и OR на примере программы 14.
С IF (unless) всё прозрачно;
Функция Open, как известно, возвращает False в случае неудачного открытия файла и ничего не возвращает в случае удачи. Значит если Open вернет False, оператор OR будет вынужден проверить: "а не является второе выражение True?!" и выполнит вывод строки на экран браузера.

Оператор Rename возвращает кол-во переименованных файлов. Значит, если ему не удастся переименовать 1 файл, он вернет 0, т.е. False.
В нашем случае если Rename вернет 1, т.е. True, оператор AND должен будет проверить на истинность второе выражение и выполнит вывод на экран браузера. Если же Reneme вернет False, второе выражение выполнено не будет.

* * * *

Напишите программу, которая проверяет наличие файла index.htm в директории с HTML файлами и при его наличие выдает его браузеру. Т.е. Вам нужно его полностью считать и распечатать.

Попробуйте использовать разные способы считывания файла (посимвольный и построчный) в зависимости от передаваемого скрипту параметра.



Функция Unpack



Функция Unpack

unpack (шаблон, выражение);

Функция, обратная pack(). Распаковывает строку выражения по указанному шаблону в массив значений. В скалярном контексте возвращает значение только первого элемента. Шаблоны такие же как и в pack().

Символ '%' в шаблоне означает, что вы хотите получить вместо значения его контрольную сумму. По умолчанию - 16-битную.

* * * *

Напишите программу, выводящую латинский алфавит. ASCII код первой буквы алфавита - 65. В латинском алфавите 25 букв.

Попробуйте записать в файл IP адрес, затем считать его и сравнить (программно с помощью оператора IF) его с текущем IP адресом. Почему, как вы думаете, они не совпали?
запись IP адреса осуществляйте такой строкой:

print "$ENV{'REMOTE_ADDR'}\n";

Функция Unshift



Функция Unshift

unshift массив, список;

Противоположное shift. Помещает элементы списка в начало массива.



Функция USE



Функция USE

use модуль список use модуль

Указывает библиотечный модуль, из которого можно вызывать подпрограммы. Список перечисляет имена подпрограмм, которые добавляются к текущей области имен. Если не указан, то все имена. Действие аналогично блоку:

BEGIN { require модуль; import модуль список; }

Сам модуль должен располагаться в системной области Perl файлов.

И так, основные правила этикета, которых нужно придерживаться при написании программ:

Вызывать Perl интерпретатор нужно с параметром "-w". Это заставит его более тщательно анализировать код с целью выявления сбойных или потенциально сбойных участков; Используйте в программе прагму (модуль) Strict. Аналогично предыдущему пункту, но код анализируется еще строже; Описывайте все переменные, которые используете в программе. Описать переменную можно оператором my(); Не проводите никаких операций над не определенными или не существующими переменными, ячейками массива или ключами хеша. Программно проверяйте "наличие" ячейки массива или ключа хеша перед операцией, если не уверенны в их существовании на момент использования; Давайте переменным "говорящие" имена. Это облегчит жизнь Вам и Вашим коллегам при анализе кода; Не используйте оператор goto! Старайтесь не создавать рекурсивных функций (функции, которые вызываются сами из-под себя), они иногда приводят к возникновению "вечных циклов". А это в свою очередь является ошибкой программирования; Сопровождайте комментариями все строки кода, которые могут интерпретироваться читателем двояко или будут непонятны.
Вообще, комментарии никогда не бывают лишними. Код, где комментирована буквально каждая строка легко читается и отлаживается; они помогут Вам вспомнить и разобраться в коде, который вы когда-то начали писать, но, по каким-то причинам, не закончили; Не пишите строки, которые выходят за пределы экрана. Оптимальным кол-вом символов в строке является 66-88; В блоках кода (участках, заключенных в фигурные скобки) текст должен иметь выступ в 1 табуляционный символ или в 5 пробельных символов; Не пишите код сплошным текстом. Разбивайте его на функциональные участки и оформляйте их в процедуры; Перед выполнением операции деления проверяйте, не производится ли деление на ноль; Перед открытием файла проверяйте его на предмет существования и возможности открытия (бывает так, что файл существует, но занят другим приложением); Используйте альтернативные операции при невозможности выполнить какое-либо действие. К примеру, используйте операторы || (or) и die, если имеет место ошибка при открытии файла.

Из всего вышесказанного, грамотно написанная программа выглядит примерно так:

#!/usr/bin/perl -w use strict; print "Content-type: text/html\n\n"; my ($summ,$i); $summ=0; for ($i=-5;$i<=5;$i++){ $summ+=10/$i if $i != 0; } print $summ; # выводим сумму результатов деления 10 на # диапазон от -5 до 5

Функция Utime



Функция Utime

utime (Date1,Date2,список_файлов);

Изменяет дату обращения и модификации файлов из списка. Первые два элемента списка должны указывать новое значение даты обращения и модификации. Возвращает количество измененных файлов.



Функция Values



Функция Values

values хеш;

Возвращает обычный массив со всеми значениями хеша. В скалярном контексте возвращает количество значений хеша.

%hash=( 'Windows 98' => '1998', 'Windows 2000' => '1999', 'Windows XP' => '2001' ); foreach $k (values %hash){ print "$k
"; }

* * * *



Help



Help

Ссылка Описание
LAMABOOK Замечательная книжка Рэндала Шварца, которая реально поможет Вам изучить Perl. Почти в каждом уроке я ссылаюсь на неё как на дополнительный материал.
BOOK Очень хорошее пособие по изучению Perl. Автор Маслов Владимир Викторович
BOOK #2 Выжимка одной из книг Р.Шварца
[FAQ по Perl] Небольшое FAQ по Perl, любезно предоставленное Webscript.ru
[подробно об HTTP] Статься о протоколе HTTP. Взято с perl.ru
[подробно о хэшах] Название говорит само за себя. Взять также с perl.ru
[массивы] Примеры скриптов, использующих массивы. Взято с perl.ru
[регулярные выражения] Очень подробный материал, настоятельно рекомендую прочитать. Взято с perl.ru
[права доступа] Статья рассказывает о том, как правильно нужно выставлять права доступа для CGI скриптов
[работа с файлами] Довольно неплохо описаны функции для работы с файлами. Взято с Webscript.ru
[работа с файлами 2] Очень подробная статья с примерами. Взято с Webscript.ru
[установка CGI скриптов] Подробная статья о том как правильно установить CGI скрипт. Взято с Webscript.ru
[пособие от Леши] Довольно толковое пособие по CGI программированию от некоего Леши.
[коротко о SSI] Коротко о SSI. Предоставлено Кормушкой.РУ
[подробно о SSI] Всё от туда же
[Perl = простота Basic + мощь Cи++] Статья Михаила Евдокимова о Perl-е.
[Спецификация языка Perl] Справочник по Perl, автор Алена Федосеева
[Работа с cookies на Perl] Работа с Cookies с использованием модуля CGI
[Что такое Cookies и с чем их едят] Работа с Cookies, взгляд изнутри


Кнопки



Кнопки

Просто кнопки, как таковые, для CGI программиста бесполезны, т.к. для их программирования необходимо знать языки, работающие на локальном браузере (JavaScript, VBScript и др.). Больший же интерес представляют заранее запрограммированные кнопки "Submit" и "Reset". Первая, как Вы уже знаете, отправляет данные скрипту, вторая - обнуляет все эл-ты формы.
Для создания многих элементов формы, в том числе и кнопок, служит тэг <input>. Самым главным параметром этого тега является "type", т.к. в нем задается тип эл-та формы. Чтобы создать кнопку, значением этого параметра должно быть "button". Вот код самой простой кнопки: <input type="button">. Если Вы передадите этот код браузеру, то увидете что этой кнопкой практически нельзя пользоваться, т.к. она очень маленькая и не имеет надписи. Надпись можно задать в параметре "value". Еще у кнопок есть атрибут "disabled", который превращает эту кнопку в декоративную:

<input type="button" value="button" disabled>

Кнопка "Submit" создается такми же образом, только значение параметра "type" должно быть "submit". Анологично с кнопкой "Reset":

<input type="submit">
<input type="reset">



Общее количество посещений:


Общее количество посещений: <!--#exec cgi="/cgi-bin/counter.pl" -->

Метод POST



Метод POST

8-/ наконец-то закончили с формами, осталось рассказать только о методе POST.
Суть этого метода заключается в передаче данных в теле HTTP запроса, а не в строке URL, как при методе GET. Это снимает ограничения на длину передаваемых данных. Напомню, что длина URL не должна превышать 2048 символов. Поэтому целесообразно использовать этот метод, если вы включили в форму областью потенциально большого объема текста.

* * * *

Модернизируем программу 10 с учетом полученных знаний так, чтобы вводить данные не вручную в поле URL, а в текстовые поля.

#!/usr/bin/perl #programm 11 print "Content-Type: text/html\n\n"; &parse_form; print "<form method=\"get\" action=\"/cgi-bin/script.pl\"><br>\n"; print "A = <input name=\"a\" size=3 value=\"$FORM{a}\"><br>\n"; print "B = <input name=\"b\" size=3 value=\"$FORM{b}\">\n"; print "<input type=\"hidden\" name=\"match\" value=1>"; print "<input type=\"submit\" value=\"Calc\"></form>\n"; if ($FORM{'match'} == 1){ print "A + B = ",$FORM{'a'}+$FORM{'b'},"<br>"; print "A - B = ",$FORM{'a'}-$FORM{'b'},"<br>"; print "A * B = ",$FORM{'a'}*$FORM{'b'},"<br>"; print "A<sup>B</sup> = ",$FORM{'a'}**$FORM{'b'};}

* * * *

Напишите программу, которая запрашивает кол-во текстовых полей и выводит их одно под другим. Напротив каждого поля должна располагаться "галочка". По нажатию на "submit", форма передается скрпту, который выводит значение только тех полей, напортив которых "галочка" была отмечена. Ограничите максимальное количество полей значением 10, а минимальное - тремя. Используйте метод Post при передаче формы.



MIME



MIME

MIME (Multipurpose Internet Mail Extensions) - Многоцелевые расширения почты интернета, были разработаны как стандарт идентификации различных типов файлов для отправки их по почте, но в последствии их функции были расширены и на другие сервисы Интернета. Для типа MIME, который прописывается в реестре Windows и используется различными программами, в частности, указывается расширение файла и программа, с помощью которой данный тип файлов будет обрабатываться.

Типы MIMEТип файла
Архив RARapplication/x-tar
Архив ZIPapplication/x-zip-compressed
Исполняемый файл (.exe)application/octet-stream
Аудио- или видеозапись ASFvideo/x-ms-asf
Аудио- или видеозапись WMVvideo/x-ms-wmv
Аудиозапись AIFFaudio/aiff
Аудиозапись AUaudio/basic
Аудиозапись MIDIaudio/mid
Аудиозапись MP3audio/mpeg
Аудиозапись WAVaudio/wav
Аудиозапись WMAaudio/x-ms-wma
Аудиозапись AVIvideo/avi
Аудиозапись AVI (.avi)video/x-msvideo
Видеозапись Indeo (IVF)video/x-ivf
Видеозапись MPEG (.mpeg .mpg .mpe)video/mpeg
Видеозапись QuickTime (.qt .mov)video/quicktime
Визитная карточка, используемая почтовыми программами для хранения данных об адресатеtext/x-vcard
Графический файл ARTimage/x-jg
Графический файл BMPimage/bmp
Графический файл GIFimage/gif
Графический файл JPEGimage/jpeg
Графический файл Macromedia Flashapplication/futuresplash
Графический файл TIFFimage/tiff
Документ Adobe Acrobatapplication/pdf
Документ HTMLtext/html
Документ Microsoft Excelapplication/x-msexcel
Документ Microsoft Wordapplication/msword
Документ RTFapplication/msword
Документ RTXtext/richtext
Документ XMLtext/xml
Приложениеapplication/x-msdownload
Приложение HTML (HTA)application/hta
Таблица стилей HTMLtext/css
Текстовой документtext/plain


Область многострочного редактирования



Область многострочного редактирования

Её еще называют областью потенциально большого объема текста. Синтаксис её таков:

<TEXTAREA>
Значение по умолчанию
</TEXTAREA>

У этого тега есть дополнительные параметры и атрибуты:

name имя области
rows кол-во строк области в символах
cols ширина области в символах
<textarea cols="20" rows="5">
А роза упала на лапу Азора
</textarea>
А роза упала на лапу Азора


Оператор do



Оператор do

do {operator} while (EXPR) do {operator} until (EXPR)

Оператор while/until проверяет условие в начале каждого цикла, до входа в него. Если результат проверки условия — "ложь", цикл не будет выполнен вообще.

Иногда возникает необходимость проверять условие не в начале, а в конце цикла. Для этого в Perl есть оператор do {} while, который очень похож на обычный оператор while, за исключением того, что он проверяет выражение только после однократного выполнения цикла.

* * * *

Приведенная ниже программа демонстрирует работу оператора While.

#!/usr/bin/perl #programm 7 print "Content-Type: text/html\n\n"; $i=1; while($i<9){ print "$i X 7 = ".$i*7; print "<BR>"; }continue{$i++}

* * * *

Модернизируйте программу, которая выводит таблицу Пифагора (Всё равно какую) так, чтобы вместо оператора For в ней использовались операторы While и Until.

Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]



Оператор Foreach



Оператор Foreach

foreach VAR (LIST) {operator}
Переменной VAR присваивается поочередно каждый элемент списка LIST и выполняется блок. Если VAR опущено, то элементы присваиваются встроенной переменной $_. Если в теле блока изменять значение VAR то это вызовет изменение и элементов списка т.к. VAR фактически указывает на текущий элемент списка. Вместо слова foreach можно писать просто for - это слова синонимы.

оператор ..

Элемент списка может включать операцию конструктора списка. Это два скалярных значения, разделенных двумя точками. Данная операция создает список значений, начиная с левого скалярного значения и кончая правым скалярным значением, с шагом 1.

Если правый скаляр меньше левого, то список будет пустым, так как в обратном направлении отсчет вести нельзя. Если последнее значение не соответствует целому числу шагов, то список заканчивается там, где приращение на единицу привело бы к появлению числа, не принадлежащего заданному диапазону. Ниже приведенная программа демонстрирует работу операторов foreach и "..":

#!/usr/bin/perl print "Content-Type: text/html\n\n"; @array=(1..10); foreach $a(@array){ print ($a,"<BR>"); }

* * * *

Как изменится длина 8-и элементного массива, если 2-ум его ячейкам присвоить пустую строку ("") ? Если значения ячеек совпадают с номерами их индексов, то какое значение записано в 9-й ячейке массива? Анологичный 9-и элементный массив. Какое значение будет записано в ячейке с номером "-1" ? Какое число элеменотов вернет такая конструкция: ('3.8'..'9.1') ?

Напишите программу, выводящую все простые числа из диапазона (-28..53) включительно, используя конструктор списка и оператор Foreach. Какое минимальное кол-во переменных требуется для написания такой программы?



Оператор GOTO



Оператор GOTO

goto метка;

Можно теоретически показать, что рассмотренных операторов вполне достаточно для написания программ любой сложности. В этом отношении наличие в языке оператора перехода кажется излишнем. Более того технология структурного программирования основана на принципе "программирование без GOTO": считается, что использование оператора перехода затрудняет понимание программы, делает её запутанней и сложной в отладке.
Тем не менее, в некоторых случаях использование оператора перехода может упростить программу.
В Perl метки обозначаются ЗАГЛАВНЫМИ латинскими буквами и отделяются от следующего за ним оператора двоеточием (:).



Оператор Grep



Оператор Grep

grep {блок} список;
grep (выражение, список);

Выполнят блок или выражение для каждого элемента списка. Переменная $_ содержит текущий элемент. Возвращает список элементов, с которыми выражение дало результат true. В скалярном контексте возвращает количество результатов true. Как видите, grep очень похож на foreach:

@tmp=(1,2,3); grep{print $_} @tmp;

Оператор Last



Оператор Last

last - подобен оператору break в языке С. Немедленно прерывает цикл. Блок continue пропускается



Оператор m//



Оператор m//

m/PATERN/gimosx;
/PATERN/gimosx;

Поиск в строке по паттерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_ . Опции:

g - Глобальный поиск. Поиск всех вхождений.
i - Сравнение не зависит от регистра (верхний или нижний)
m - Строка многострочная.
o - однопроходная компиляция
s - однострочная строка
x - используются расширенные регулярные выражения.

Если '/' - ограничитель, то начальное 'm' можно опустить. С помощью него в качестве ограничителя может быть любой символ кроме пробела.

PATTERN может содержать переменные, которые будут интерполироваться (перекомпилироваться) каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если вы хотите, что бы такой шаблон интерполировался один раз - добавьте /o. Это необходимо делать в циклах поиска для увеличения быстродействия, однако, если вы измените значение переменной, Perl этого даже не заметит.

Если PATERN - нулевая строка, то используется последнее регулярное выражение.

В скалярном контексте возвращается список элементы которого - результаты выполнения выражений в скобках паттерна ($1, $2, $3...). Обратите внимание что первый элемент $1.



Оператор Map



Оператор Map

map {блок} список;
map выражение, список;

Выполняет блок или выражение для каждого элемента списка. Возвращает список результатов.

@tmp=(1,2,3); $v = map $i.=$_, @tmp; print $i,"
"; print $v;

* * * *



Оператор Next



Оператор Next

next - подобен continue в С. Переходит к началу текущего цикла (блок continue вычисляется) т.е. повторяет итерацию.



Оператор q//



Оператор q//

q/строка/;
'строка';

Не интерполируемая строка литералов. Если в качестве разделителя используется одинарная кавычка, ключевое слово "q" можно опускать.
Сами того не зная, Вы используете этот оператор почти с самого первого урока.

print q^Windows 3.11^; # результат: Windows 3.11 print q?Windows 98?; # результат: Windows 98 print 'Windows 2000'; # результат: Windows 2000

Оператор qq//



Оператор qq//

qq/строка/;
"строка";

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

$var311 = "3.11"; # определяем переменные $var98 = "98"; print qq#Windows $var311#; # результат: Windows 3.11 print qq+Windows $var98+; # релультат: Windows 98 print "Windows 2000"; # результат: Windows 2000

Оператор qw//



Оператор qw//

qw/строка/;

Возвращает список, элементы которого содержат слова из строки. Т.е. пробелы рассматриваются как символы-разделители.
Следующий код подчеркнет все слова фразы, длиной 7 букв:

@array = qw(Пока толстый сохнет, худой - сдохнет); foreach $i(@array){ if (length($i) == 7){print "$i "} else {print "$i "} }

Оператор qx//



Оператор qx//

qx/строка/;
`строка`;

Сначала строка интерполируется, а потом выполняется как системная команда.

print ""; print `dir`; print "";

Этот код выведет очень много ценной информации ;-) . Не забудьте переключить кодировку браузера в "DOS".



Оператор Redo



Оператор Redo

redo - начать новый цикл не вычисляя EXPR и не выполняя continue блок.

* * * *

Пример применения оператора next:

#!/usr/bin/perl print "Content-Type: text/html\n\n"; M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 next M1 if $i < 3; # Переходим в начало если $i < 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } # получаем 1 2 4 6

Пример применения оператора last:

#!/usr/bin/perl print "Content-Type: text/html\n\n"; M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 last M1 if $i > 3; # Выход из цикла если $i > 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } # результат: 2 4

Пример применения оператора redo:

#!/usr/bin/perl print "Content-Type: text/html\n\n"; M1: while ($i < 6) { ++$i; # Увеличиваем счетчик на 1 redo M1 if $i == 3; # Далее пропустить для $i = 3 ++$i; # иначе увеличиваем счетчик еще раз на 1 } continue { print "$i "; # Печатаем $i } # получим 2 5 7

* * * *

Напишите программу, выводящую все простые числа из диапазона (-28..53) включительно. Есть ли вообще простые числа в этом диапазоне?
Для справки: простое число, это такое число, которое дилится без остатка только на себя и еденицу.

Напишите программу, вычисляющую произведение двух соседних числа ряда из диапазона (-28..53), и если это число делется без остатка на 7, выводит результат на экран и увеличивает переменную цикла на 2.



Оператор S///



Оператор S///

s/шаблон/подстрока/egimosx;

Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_ . Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. Опции:

e - Рассматривать правую часть как выражение.
g - Глобальный поиск.
i - Без различия регистра букв
m - многострочная переменная
o - компилировать шаблон один раз
s - однострочная переменная
x - расширенное регулярное выражение

Разделитель '/' можно заменить на любой алфавитно-цифровой символ кроме пробела.

$var = "12345"; # исходная строка $var =~ s/1/0/; # Заменить '1' на '0'. Результат 02345 $var =~ s(5)(.); # Заменить '5' на '.' Результат 0234.

Здесь в качестве разделителя применены скобки, поэтому подстрока взята в две скобки.

$var =~ s/\d*/каламбур/; #Заменить все цифры. Результат 'каламбур.' $var =~ s/а/о/g; # Заменить все 'а' на 'о'. Результат 'коломбур.' $var = "12 34"; # Новое значение $var =~ s/(\d\d) (\d\d)/$2 $1/; # Поменять местами числа. Результат '34 12'.

Оператор Split



Оператор Split

split (/шаблон/, выражение, предел);
split (/шаблон/, выражение);
split (/шаблон/);
split;

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

($a, $b, $остаток) = split(/ /, "Один Два Три Четыре",3); # $a = 'Один', $b = 'Два' и $остаток = 'Три Четыре'

Если шаблон содержит круглые скобки, то символы-разделители, указанные в них, вставляются в результирующий список как обычные элементы, причем вставляется символ, который совпал с разделителем

@a = split(/([,.])/, "Один,Два.Три"); # @a = ("Один", "," ,"Два", ".", "Три")

И еще один примерчик:

@a = split(//,"червь"); # @a = ('ч','е','р','в','ь')

* * * *

Попробуйте создать так называемую "плоскую базу": напишите скрипт, который записывает в файл строчки такого вида: "переданная_строка1 & переданная_строка2 & переданная_строка3", при каждом обращении к скрипту. И выводящий на экран самую длинную строку из первых значений и саму короткую из вторых. Эти строки должны сопровождаться значениями из 3-их строк.



Операторы tr/// и y///



Операторы tr/// и y///

tr/таблица1/таблица2/cds;
y/таблица1/таблица2/cds;

Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стирании. Без оператора =~ или != операция выполняется со строкой $_. Для совместимости с программой sed вместо tr можно писать 'y'.

Опции:

c - дополнение "таблица1"
d - стереть найденные, но не замененные символы.
s - "сжать" повторяющиеся замененные символы.

Если указана опция /d таблица2 всегда интерпретируется как положено. Другими словами, если таблица2 короче, чем таблица1, то символ из таблицы1 интерпретируется всегда. Если таблица2 - null, то все символы строки остаются неизменными. Это удобно для подсчета количества символов в строке определенного класса или для сжатия повторяющихся символов, например, пробелов.

$s = "hello"; # Исходная строка $s =~ tr/a-z/A-Z/; # Заменить малые буквы на большие. Результат # 'HELLO' $s = 'Hel....lo'; $s =~ tr/a-zA-z/_/c; # Заменить все не буквы на '_' # Результат 'Hel____lo' $s =~ tr/_/ /s; # Заменить '_' на ' ' и сжать. # Результат 'Hel lo' $s =~ tr/a-zA-Z /a-zA-Z/d; # Удалить все не буквы. Результат 'Hel

* * * *

Попробуйте написать функцию, которая запрашивает выражение и число. Функция должна возвращать номера слов в выражении, длина которых превышает переданное число.

Дополнительная информация: [регулярные выражения]



Открытие и закрытие дескриптора файла



Открытие и закрытие дескриптора файла

open (FileVar, FileName);
close (FileVar);

Функция Open открывает указанный файл и ассоциирует с ним файловую переменную (дескриптор файла). В зависимости от спецсимвола, стоящего перед именем файла, файл можно открыть с разным способом доступа к нему.

open (FV,"FN"); Файл открыт для чтения. Запись в него запрещена.
open (FV,">FN"); Файл открыт для записи. Когда файл открыт таким способом, его содержимое автоматически стирается (а если файл не существует - создается) и в файл можно добавлять данные.
open (FV,">>FN"); Файл открыт для записи в конец. При таком способе открытия файла, тело файла не изменяется и разрешено добавлять строки в его конец.
open (FV,"+<FN"); Файл открыт для чтения и записи.
open (FV,"|FN"); Направить информацию на вход программы.
open (FV,"FN|"); Считать информацию с выхода программы.
open (FV,"|FN|"); И то и другое.

Из файла можно считать данные в виде массива и построчно. При считывании файла построчно, какой-то переменной, при первом считывании, присваивается первая строка файла и указатель перемещается на следующую строку. Такое присваивание возвращает True. При втором считывании присваивается вторая строка, при третьем - третья и т.д. до конца файла. Когда указатель дойдет до последней строки, счетчик сбрасывается, указатель перемещается на первую строчку файла, а возвращаемое выражение становится равным False

При считывании файла в массив, каждая строка файла помещается в отдельную ячейку массива. Плюсы и минусы этих методов очевидны: При считывании файла построчно, экономится память сервера, но работать с файлом становится неудобно, да и этот метод не очень производителен. Другое дело - работа с массивом: это быстро, это удобно, но есть очевидный минус - сильная загрузка памяти сервера. Но несмотря на это, данный метод пользуется огромной популярностью при написании небольших скриптов.

Чтобы считать файл/строку в какую-то переменную, этой переменной присваивают дескриптор файла, заключенный в треугольные скобки:

@array = <FileVar>; $Var = <FileVar>;

Чтобы закрыть файл, используют функцию Close. Хотя её использование не обязательно, т.к. файл закроется сам после окончания выполнения скрипта, но желательно и является признаком хорошего стиля программирования.



Переключатель



Переключатель

Переключатель должен иметь имя и значение. Имя задается в параметре "Name", значение в "value" (в отличие от кнопок, где value - надпись на кнопке). В том случае, если переключатель выбран, передается его имя и значение. Если не выбран - ничего не передается. Если необходимо чтобы переключатель был по умолчанию отмечен, он должен иметь атрибут "checked".

<input type="checkbox" checked>