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



Операторы

Набор операторов в 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 раз/(https:\/\/)?.*\.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){
 #че-нибудь сделаем...
 

 
« Предыдущая статья