Учебное пособие по CGI-программированию - Операторы

ОГЛАВЛЕНИЕ


Операторы

Набор операторов в Perl Очень широк,многие из них прямые аналоги имеющихся в других языках,например if,for,while;но есть и значительные улучшения имеющихся и конечно новые...
Тот же самый оператор if имеет две формы (как когда удобнее):

if(условие)оператор;
оператор if условие;
В пару к оператору if имеется оператор unless : означающий if с отрицанием:
unless(($method eq 'GET')||($method eq 'POST')){print "Unsupported method";}
print "Ok" unless $x < $y;
Также в пару while существует until
синтаксис оператора for полностью аналогичен C:
for($i=0;$i<10;$i++){
print $i;
}
новшеством(и приятным) является foreach позволяющий пройтись по всем элементам массива,присваивая по очереди его элементы какой-то переменной, его синтаксис такой:
foreach $переменная (@массив){
блок операторов;
}
или
foreach (@массив){
операторы;
}
Последний пример особенно важен для упрощения вашего тяжкого труда програмиста и демонстрирует интересную особенность Perl-переменную по умолчанию $_: в огромном количестве операторов и функций при опускании аргумента она подразумевается по умолчанию. Она также по умолчанию сопоставляется с регулярным выражением:
следующий пример
@Data=<STDIN>;
foreach(@Data){
chomp;
print if /^From:/;
}
аналогичен такому:
@Data=<STDIN>;
foreach $_ (@Data){
chomp($_);
print $_ if $_ =~ /^From:/;
как видите затраты труда значительно сокращаются,благодаря этому маленькому трюку.
Регулярные выражения.
регулярное выражение записывается между двух слэшей /рег_выр/
if(/abc/){
print '$_ содержит abc\n';
}
это самый простой пример применения регулярного выражения а теперь посложнее вот тут в табличке (из того что я помню наизусть):

СимволЗначениеПример применения
.Соответствует любому символуprint if /ab.c/;
[мн-во симв]Соответствует любому символу из данного мн-ва/[abc]d/;#соответствует ad,bd,cd
[^мн-во]Отрицание мн-ва символов/[^xyz]/;#
(....)Группировка элементов(и также запоминание в переменных $1 $2 $3 ...)/(xyz)*/
/([abc].[^xy]qwerty)/
(..|..|..)Одна из альтернатив 
*повторение образца 0 или более раз/.*/;#соответствует всему
?Повторение 0 или 1 раз/(http:\/\/)?.*\.cgi/
+Повторение 1 или более раз 
{n,m}повторение от n до m раз 
{n}повторение точно n раз 
{n,}повторение n и более раз 
Спец символы:  
\t \r \n ...Управляющие символы:табуляции,возврат каретки,перевод строки..... 
\dСоответствует цифре,Аналог [0-9] 
\DСоответствует нецифровому симсволу,аналог[^0-9] 
\wСоответствует букве 
\WСоответствует небуквеному символу 
\sСоответствует пробельным символам(пробелы,табуляции,новые строки..) 
\SСоответствует непробельному символу 
\bСоответствует границе слова$test1="this is test";
$test2="wise";
if($test1=~/\bis\b/){print "1";}#соответствует
if($test2=~/\bis\b/){print "2";}#нет
\BСоответствует не границе слова/\Bis\B/ соответсвует 'wise' но не 'is'

Для того чтоб поместить в регулярное выражение любой специальный символ,поставьте реред ним обратный слэш Заставить Perl игнорировать регистр можно поставив i после регулярного выражения

print "Are you sure?:";
$answer=<STDIN>;
if($answer=~/Y/i){
#че-нибудь сделаем...