Perl как язык программирования — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Perl как язык программирования

2022-12-30 19
Perl как язык программирования 0.00 из 5.00 0 оценок
Заказать работу

ЯЗЫК ПРОГРАММИРОВАНИЯ PERL

Наиболее широко применяемым языком для написания скриптов является Perl. Эта глава посвящена языку Perl и его использованию. После того как вы научитесь программировать, используя Perl, вы сможете использовать его для написания скриптов, с помощью которых решаются разнообразные задачи программирования для Internet и Web. Особый упор будет сделан на тех особенностях, которые используются при написании CGI-скриптов. Если вы никогда не программировали ранее на языке Perl, используйте эту главу как отправную точку в егоосвоении. Концепции, с которыми вы познакомитесь в этой главе, научат, как писать профессиональные скрипты на языке Perl. В главе рассматриваются не только основы программирования на Perl, но также и несколько других аспектов. К моменту окончания чтения главы вы будете в состоянии усвоить следующие ключевые концепции: Perl является интерпретируемым языком программирования, специально ориентированным на обработку текста. Программисты часто называют программы на языке Perl скриптами. Используя Perl,программисты создают CGI-формы. Perl поддерживает операции с файлами и с базами данных. Это делает его хорошо приспособленным для хранения и извлечения информации в соответствии с потребностями пользователей Web.Perl снабжается отладочной программой, с помощью которой вы тестируете код Perl.

PERL КАК ЯЗЫК ПРОГРАММИРОВАНИЯ

Perl (Practical Extraction and Report Language) является переносимым, интерпретируемым языком, идеально приспособленным для многочисленных приложений по обработке текста. Perl поддержи вает структурированные программные конструкции, как и большинство языков программирования высокого уровня, и предлагает богат ство встроенных возможностей, накопленных им за годы эволюции среде UNIX. Perl является бесплатным программным обеспечением.Его можно получить платно, и книга <Web-программирование> служит его бесплатному распространению). Фактически, Perl версии 5 имеется, на CD-ROM, прилагаемом к этой книге. Эта глава, однако, посвящена в первую очередь концепциям Perl версии 4, которая пол ностью совместима с версией 5 и широко используется на Web.

ИСТОРИЯ PERL

Отцом языка Perl является Ларри Вол (Larry Wall). Он разра ботан в 1986 году для создания отчетов о содержании многочислен ных текстовых файлов в среде UNIX. Поскольку существующие сред ства не подходили для решения такой задачи, Вол (Wall) изобрел новое средство для ее решения. Название Perl oзнaчает практичес кий язык дляизвлечения и составления отчетов (Practical Extraction а Report Language). Вол продолжал добавлять различныевозможности к Perl и сделал его доступным для общего пользования. Популярность Perl возрастает до сих пор, и он стализлюбленным средством многих программных пакетов. Умение программировать на Perl имеет возрастающую важность при составлении резюме.

БОГАТСТВО ВОЗМОЖНОСТЕЙ ЯЗЫКА PERL

Perl предоставляет разработчику широкий спектр возможностейдля создания кратких и эффективных программ. Ниже приведены некоторые наиболее замечательные черты Perl. Далее в главе вы познакомитесь с использованием каждой из них:? Ассоциативные массивы,которые индексируются программами с использованием нецелых ключей? Автоматическое преобразование типов между целыми числами,числами с плавающей точкой и строками? Автоматическое преобразование размера массивов? Функции для преобразования бинарных данных? Широкая поддержка так называемых регулярных выражений, которые программы используют для поиска, замены и других операций,связанных с разбором текста? Функции вывода/ввода файлов? Функции форматированного вывода, наподобие функции С, с добавлениемк ним способности генерации отчетов на основе шаблонов (template)? Полный набор.операторов С, с добавлением также операций посравнению строк? Функции для обработки списков, которые поддерживают стеки, очереди и другие данные списочных типов? Функциисистемного сервиса? Богатый набор операторов и структур управления, включая подпрограммы

ИСПОЛЬЗОВАНИЕ PERL

Чтобы разобраться, как использовать Perl, необходимо проанализировать коды написанные на нем. Самый простой путь познакомиться с языком Perl состоит в изучении коротких примеров. Следующий раздел основан на коротких примерах для того, чтобы ввести вас в курс дела. После того как вы поймете основы техникипрограммирования на языке Perl, вы сможете писать на нем CGIскрипты.

ЗНАКОМСТВО С ЯЗЫКОМ PERL

Хочется верить, что вас удалось убедить в необходимости хотя бы рассмотреть использование языка Perl для написания скриптов CGI. В следующих разделах вы узнаете, как запускать Perl наисполнение и как создавать полезные скрипты на языке Perl. Благодаря сходству Perl и С, в этой главе мы сосредоточим внимание натом, что объединяет их, и на их различиях. Больше внимания в главе будет уделено различию между этими языками.

<HELLO WORLD> НА ЯЗЫКЕ PERL

Большинство учебников по языкам программирования начинаетсяс простейшей программы, которая выводит текст <Hello World>. Всоответствии с этой традицией мы приводим нашей книге несколькопримеров программ <Hello World>. Следующий код служит для выводана экран сообщения <Hello World> три раза, используя три различных способа:

# Три способа как сказать <Hello World> printf("Hello world\n"); printf("%s\n",'Hello world'); print "Hello World", "\n"

Первая строка представляет собой комментарий. На языке Perlзнак диез (#) означает комментарий. Когда Perl находит этот знак,он игнорирует весь текст, начиная с него и до конца строки. Знакдиез служит единственным способом ввести комментарии на языкеPerl. В отличие от С здесь нет конструкции, которая сразу бы определяла несколько строк комментариев. На первый взгляд функцияprintf выглядит так же, как в языке С. Однако вы можете заметить,что программа не содержит функции main. Хотя скрипты поддерживают подпрограммы (аналогичные функциям С), скрипт не определяетраздела, который бы содержал тело функции main. Вместо этого интерпретатор Perl сразу начинает исполнение скрипта с первого выражения в файле. Второе выражение, содержащее функцию printf,опять-таки выглядит аналогично своему использованию в языке С, заисключением того, что вторая строка аргументов заключена в одинарные кавычки ('') в противоположность двойным (""), используемым в С. В языке Perl строка в двойных кавычках означает определенный род преобразования. Например, интерпретатор Perl преобразует выражение новой строки в двойных кавычках "\n" в символ новой строки. Скрипт Perl использует одинарные кавычки для включения строковых литералов, т. е. строковых выражений, как это написано выше. Например, Perl напечатает выражение в одинарных кавычках ('\n') как два знака ('\') и 'n', а не как знак перехода нановую строку. Наконец, последняя строка кода программы содержитфункцию print, которой нет в языке С. В этом случае наиболее полезная черта этой функции заключается в отсутствии скобок. Оказывается, что вы можете всегда включать скобки в состав функцииязыка Per]. Однако в большинстве случаев необходимости в них нет.Perl требует включения скобок только в том случае, если без нихвыражение оказывается не полностью определенным, двусмысленным.Тем не менее, включение скобок в код соответствует хорошей традиции, и вам не следует отказываться от нее.

УСТАНОВКА PERL

Теперь настало время попробовать работать с языком Perl непосредственно. Если у вас не установлен Perl на вашей системе, тонеобходимо сделать это. Обратитесь к файлу Perl.txt на CD-ROM,который входит в комплект книги. Далее полагаем, что Perl правильно установлен. Наберите команду для запуска скрипта Perl,аналогичную следующей:

C:\PERL>perl script-name <ENTER>

Например, создайте файл с именем hello.pl, содержащий показанную ниже строку:

Print "Hello world\n"

Далее в командной строке наберите следующую команду:

C:\PERL>perl hello.pl <ENTER>

На экране вы увидите следующий текст:

Hello World

Как уже говорилось, если вы используете UNIX-систему, томожно вызвать скрипт Perl таким же образом, как другую самостоятельную программу. Для того чтобы начать, отредактируйте файлтак, чтобы первая строка была аналогична представленной ниже:

#!/usr/bin/perl print "Hello world\n"

В этом случае первая строка указывает системе, что необходимо запустить скрипт, используя Perl. Можно видеть, что эта стро-ка является комментарием и это не случайно, так что Perl, проигнорирует ее. Тем не менее, большинство UNIX командных скриптовshell просмотрят два первых символа в любом исполняемом скрипте.Если первыми символами служат #!, то shell будет использовать остаток строки в качестве команды для запуска скрипта. В данномслучае такой командой является /usr/bin/perl. Shell пересдаст имяскрипта Perl автоматически. Для того чтобы запустить скрипт,необходимо запустить команду chmod для того, чтобы указать скрипту на файл, который необходимо выполнить (например, chmod + хhello.pl). В зависимости от программы shell, также может потребоваться набрать команду rehash для того, чтобы указать программеshell, что вы добавили новую команду. Возможно, также потребуется модифицировать путь к Perl, если он не инсталлирован в подкаталоге /usr/bin вашей системы.

Примечание: Большинство скриптов Perl используют в качестве расширения.р1, но это необязательно. Если вы запускаете скрипт Perlкак отдельную программу, то, возможно, более удобным будет вообще опустить расширение.

ТИПЫ ДАННЫХ В PERL

Типы данных используются в программах при объявлении переменных. Короче говоря, тип данных определяет то множество значений, которые может принимать переменная, а также набор операций,которые программа может выполнять с ней. В языке Perl данные могут быть числом или строкой символов. Одно значение называетсяскалярной величиной или просто скаляром. Ниже приведены примерыскалярных значений, которые используются в языке Perl:? Десятичные: 127 или 127.0 или 1.27Е2? Шестнадцатиричные: Ox7F или 0x7f? Восьмеричные: 0177 (первый 0 указывает, что используетсявосьмеричное число)? Строка: "Hello World\n" или 'Hello World'

Например, следующая команда использует отладчик Perl для того,чтобы вывести число 0177 восьмеричной системы, соответствующеечислу 127 десятичной:

DB<4> р 0177 <ENTER> 127

Perl переводит данные в свой внутренний формат. Когда Perlпечатает восьмеричные или шестнадцатиричные значения, он сначалапереводит их в десятичный формат, как было показано.

Примечание: Как вы узнаете, скрипт Perl позволяет использоватьфункцию printf для того, чтобы выводить, значения в вызываемомформате, в таком как восьмеричный или шестнадцатиричный.

В качестве внутреннего представления всех чисел используется формат с плавающей запятой двойной точности (double). Инымисловами, среди внутренних форматов нет целочисленного. Тем не менее, в большинстве случаев вы можете не обращать на это внимания,и Perl сделает все сам как надо. Например, если вы используетевеличины в контексте, где только целочисленные значения имеютсмысл, Perl сам автоматически усечет число.

Примечание: Если вы программируете на С и использовали целочисленное деление с усечением целых чисел автоматически, то, программируя на языке Perl, надо не забыть выполнить усечение вручную, используя функцию int().

Следующая команда иллюстрирует, как Perl обрабатывает числацелого типа и с плавающей запятой:

print 6 & 3; # выведет 2 print 6.9 & 3.1 # print 7 / 2 # выведет 2.3333 не целое print int(7/3) # выведет 2

Точно так же, как Perl преобразует числа с плавающей запятой в целые числа: когда скрипт использует целочисленные значения, он также преобразует числа в строки и наоборот, когда такоепреобразование имеет смысл. Например, если скрипт использует числа в контексте, где только строки имеют смысл, например, при соединении строк, он конвертирует числа в строки. Аналогичным образом, если требуется использовать строки там, где только числаимеют смысл, то Perl конвертирует их в числа. Работая со скриптами Perl, обычно не надо беспокоиться о внутреннем представлениискалярных величин. Perl поддерживает также концепцию булевых значений, но не имеет для их описания специального типа. Как и в С,численное значение рассматривается истинным, если оно не равнонулю. Дополнительно строковое значение рассматривается как истинное, если оно не равно '' или '0'. Некоторые булевы операторы,такие как <>> (больше), возвращают единицу в качестве значения<истинно> и нуль - в качестве <ложно>. Тем самым, ваш скрипт должен просто рассматривать ненулевые величины как строчного типа,так и числового в качестве булева значения <истинно>. СкриптыPerl могут группировать скалярные величины вместе и создаватьсписок (list). Если скрипт хранит список в какой-то переменной,то эта переменная становится массивом (array).

ПЕРЕМЕННЫЕ

Perl поддерживает три типа переменных: скаляры, массивы иассоциативные массивы. Как и в языке С, имена переменных пишутсяс различением строчных и заглавных букв. Таким образом, именаVAR, Var и var описывают различные переменные. Скрипт может иметьскалярную переменную под именем var и переменную-массив, такженазванную var. Они будут различаться в языке Perl в соответствиис контекстом.

Примечание: Переменные Perl нетипизированы, как это делается и вС. Например, скалярная переменная может содержать любой тип скаляра, и приведение типов осуществляется автоматически. Также, каквы могли уже заметить, переменные на языке Perl необязательнодолжны быть объявлены. Если переменная не объявлена, то Perl рассматривает ее как глобальную. Ниже вы познакомитесь с объявлением переменных и их областью видимости.

СКАЛЯРНЫЕ ПЕРЕМЕННЫЕ

Как отмечалось, скалярная переменная может содержать единственное значение. В языке Perl имена скалярных переменных всегда начинаются со знака ($). В еле дующем выражении скалярной переменной $age присваивается значение 35, а переменной $name строковое значение <Bob>. Затем используется функция print длявывода значения каждой из переменных:

$age = 35; $name = 'Bob'; print ($name,'is',$age);

Если вы сохраните эти выражения в файле под именемSCALAR.PL, то сможете запустить программу следующим образом:

C:\PERL> Perl SCALAR.PL <ENTER> Bob is 35

МАССИВЫ

Как было сказано выше, массивы представляют собой переменные, принимающие в качестве значения список из скалярных величин.Следующий текст программы на языке Perl иллюстрирует объявлениепеременных типа массив и их инициализацию:

   @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); print(@days); # выведет 'SunMonTueWedThuFriSat' print($days[4]);  # выведет 'Thu' @weekdays = @days[1..5]; # значение ('Mon','Tue','Wed','Thu','Fri') @emptylist = ();   # постой список

Ссылка на переменные типа <массив> обычно начинается со знака (@) и сопровождается значениями в квадратных скобках ([ ]).Как и в программировании на языке С, индексами массивов дляскриптов всегда являются переменные целого типа, которые обычноначинаются с нулевого значения. Вы увидите исключения из этихдвух правил в примерах, которые будут объясненены в этой главе.Третье выражение ($days[4]) служит примером массива, который ссылается на скалярное значение. Поскольку он содержит только одинэлемент, результирующее значение представляет собой скаляр. Еслииспользовать знак ($) вместо знака (@), то скрипт будет ссылаться на скалярную величину. Это замечание является очень важным. Квадратные скобки указывают, что скрипт ссылается на массив.Знак $, в свою очередь, означает ссылку на скалярную величину.Инициализация массива @weekdays осуществляется путем выборки части массива @days. В предыдущем примере массив @days использовался без индекса. Когда индекс опущен, Perl ссылается на весь массив. Аналогичным образом, в предыдущем примере массив @days инициализировался списком литералов. Кроме того, что массиву могутприсваиваться в качестве значений литералы, скрипт может такжеприсваивать массивам значения переменных или даже других массивов, как показано ниже:

@stuff = ($age, $name) @FriendsOfMine = ('Joe','Mary', @FriendsOfYours);

В следующем примере используются части массивов:

@weekend = @days[0,6]; # результат ('Sun','Sat') print (@days[1..5,0,6]);      # выведет 'MonTueWedThuFriSunSat'

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

(@stuff >= 2) || die "Too much stuff! \n";

Функция die служит директивой языку Perl закончить выполнение и выдать при этом указанное сообщение. Если сообщение не содержится, то функция просто заканчивает выполнение скрипта. Perlтакже поддерживает специальную конструкцию $# переменная, которая возвращает последнее значение индекса в массиве. Например,следующее выражение for использует $[ для того, чтобы определитьначальное значение индекса массива, и $# для определения последнего из элементов массива. При этом с помощью выражения for выводятся значения каждого из элементов:

for ($i =$[; $i <= $#stuff; $i++)  {      print $stuff[$i];  }

Записанный цикл for можно заменить следующим эквивалентнымвыражением:

Print @stuff;

АССОЦИАТИВНЫЕ МАССИВЫ

Ассоциативные массивы аналогичны обычным массивам в том отношении, что они представляют собой список скалярных переменных.Различие заключается в том, что массив должен использовать целочисленные значения в качестве индексов при выборе элементов массива, тогда как ассоциативный массив может использовать величинылюбого типа для выбора элементов массива. Индексные величины дляассоциативного массива называются ключами. Рассмотрим следующиепримеры:

$ages{'Bob'} = 35; $ages{'Mary'} = 25; $, = ' '; # change output separator for print operator print @ages{'Bob','Mary'}; # выведет '25 35' print keys(%ages);  # выведет 'Bob Mary' for $name (keys(%ages))  {      print "$name is $ages{$keys}\n";  }

Как можно видеть, программа присваивает значения переменной'$,' (скалярная переменная, именем которой является запятая).Скрипт использует это выражение для того, чтобы при дальнейшемиспользовании оператора print выходные данные не сливались междусобой. Далее в этой главе обсуждаются специальные переменные, такие как '$,'. Ассоциативные массивы идентифицируются с помощьюфигурных скобок. Так же как с массивами, при ссылках на ассоциативный массив целиком индексы не используются. Например, ссылка@ages{'Bob', 'Mary'} использует индексы в скобках, что указываетна ассоциативный массив. Префикс @ указывает на то, что речь идето массиве. Аналогичное использование знака доллара перед массивом указывает, что используется скалярная величина.

Примечаиие: Если два ключа заданы, то вместе со знаком @ эта говорит о том, что речь идет о части ассоциативного массива и результат должен быть в виде списка. Такое выражение эквивалентно#ages{' Bob'}, #ages{'Mary'}. которое имеет своим значением величину (35, 25).

Выражение print keys(%ages) вызывает оператор keys, которыйвозвращает полный список ключей ассоциативного массива. Ссылка %ages со знаком процента в качестве префикса означает, что ссылка относится ко всему ассоциативному массиву. Обратите внимание,что цикл for ссылается на переменные, заключенные в двойные кавычки. Наконец, последний из рассмотренных примеров также использует оператор keys и вводит цикл for для распечатки всех сочетаний ассоциативного массива. Цикл for ссылается на переменные,заключенные в двойные кавычки. Perl, в свою оче редь, заменитзначения, на которые ссылаются переменные, в то время, когда будет анализировать строку. Программисты называют этот процесс подстановкой переменной или интерполяцией.

Примечание: Perl не интерпретирует переменные, содержащие строкив одинарных кавычках.

ОПЕРАТОРЫ PERL

В то время как типы данных и переменных языка Perl значительно отличаются от соответствующих типов языка С, операторы ивыражения Per] должны вам показаться гораздо более знакомыми. Всеоператоры С присутствуют в языке Perl, за исключением операторыприведения типов (type), операторы обращения к содержимому указателя *ptr и оператора выбора члена структуры var.member илиvar->member. Кроме того, в языке Perl реализовано много новыхоператоров для использования в таких операциях как сравнение иобработка строк.

АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ

Арифметические операторы действуют на числовые значения, иих результатом является число. Если выражение включает строковыеоперанды, то Perl конвертирует строковые значения в числовые перед тем, как оценить выражение. Perl выполняет преобразованиестрок в числа подобно тому, как это делает функция atof()языка Св библиотеки времени выполнения. В настоящее время Perl поддерживает следующие арифметические операторы:? + сложение? - вычитание или изменение знака? * умножение? / деление (только для чисел с плавающей запятой)? % взятие по модулю (только для целочисленных значений)

Рассмотрим примеры следующих арифметических операций языка Perl:

$x = 2.5; $y = 3;   print ($x + 2*$y);         # выведет 8.5 print (7 / $y);          # выведет 2.3333333 print int (7 / $y);        # выведет 2 print (7 % $y);          # выведет 1 print (7.5 % $y);         # выведет 1

Примечание: В языке Perl оператор деления всегда имеет результатом 4ucw с плавающей точкой, а результатом взятия одного числа помодулю другого является целое число и причем предварительно обаоперанда преобразуются к целому типу.

Рассмотрим следующую операцию взятия по модулю:

print (7.9 % 3.6);  # выведет 1 то же (7 % 3) = 1

Perl также поддерживает операторы инкремента и декремента:? ++ декремент в префиксной или постфиксной форме? - инкремент в префиксной или постфиксной формеРассмотрим примеры операций инкремента и декремента:

$x = 4; ++$x; print $x; # выведет 5 $y = $x-; # уменьшит x после присвоения y значения x print "$y $x" # выведет 5 4

Наконец, Perl обеспечивает арифметический оператор для возведения в степень (**). Рассмотрим следующие примеры использования операции возведения в степень:

$x = 2 ** 3; # результат 8 $x = 2 ** 0.5; # квадратный корень из 2 $x = -2 ** -3; # 1/(-2 в кубе), результат -1/8 (-0.125)

ПОБИТОВЫЕ ОПЕРАТОРЫ

Побитовые операторы воздействуют на бинарное представлениецелых чисел и имеют целочисленный результат. Если операндом является строка или дробное число, Perl предварительно преобразуетего в целое число, обрабатывает операнд, используя 32-битноепредставление. Все побитовые операторы С представлены в языкеPerl:? | побитовое ИЛИ? & побитовое И? ^ побитовое исключающее ИЛИ? ~ побитовая инверсия? << сдвиг влево? >> сдвиг вправо

Рассмотрим следующие примеры побитовых операций:

 $x = 5;          # 101 в двоичном $y = 3;           # 011 в двоичном print $x | $y;       # 7 (111) print $x & $y;       # 1 (001) print $x ^ $y       # 6 (110) print $x & ~1;      # 4 (100) print $x << 2       # 20 (10100) print $x >> 1       # 2 (10)

Так же как в С, поведение операторов сдвига вправо зависит отреализации язы ка в случае, если операнд является отрицательным.

ОПЕРАТОРЫ СРАВНЕНИЯ

Операторы сравнения сравнивают величины двух операндов. Также как при работе с арифметическими операторами, Perl преобразует строчные операнды в численные перед тем, как выполнять сравнение. Для того чтобы позволить скрипту сравнивать строки, которые не являются числами, Perl имеет дополнительные операторыстрокового сравнения. Эти операторы сравнивают строки, используявеличины ASCII. Если численное значение задано как операнд присравнении строк, оно сначала преобразуется в строку. Таблица 12.1перечисляет операторы сравнения:

Число Строка Значение = = eq  равно!=  nе  не равно >  gt  больше чем <  it  меньше чем >=  gе  больше или равно <=  lе  меньше или равно <=> cmp не равно (результат со знаком)

Табл. 12.1. Операторы сравнения языка PerlРезультатом операции сравнения является единица, если сравнение истинно и нуль в противном случае. Однако последняя операция (<=> или cmp) может возвращать значения -1, 0 или 1 в зависимости от того, является ли значение первого операнда меньше, чемвторого, равным ему или большим.

Примечание: Оператор cmp языка Perl ведет себя, аналогично функции Strcmp() библиотеки времени выполнения языка С.

Рассмотрим следующий пример сравнения:

$x = 5;          # x равно 5 print ($x < 4);   # если false, то выведет 0

ЛОГИЧЕСКИЕ ОПЕРАТОРЫ

Логические операторы анализируют булевы выражения и возвращают значения <истинно> или <ложно> в качестве результата. Perlобрабатывает операнды логических операций как булевы величины, т.е. как истинное или ложное значение.

Логические операторы языка Perl включают следующие:

? || логическое ИЛИ? && логическое И

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

?! логическое отрицание ()??: условная операция?, последовательное выполнение

Оператор логического отрицания (!) заменяет значение булевой величины на противоположную. Так же как и в С, в языке Perl условный оператор (?:) использует три операнда. Выражение, использующее условный оператор, имеет следующую форму:

 Condition? true-result: false-result

Аналогично, следующее выражение использует условный оператор длятого, чтобы предоставить Бобу полный доступ, а всем остальным ограниченный:

$access = ($user eq 'Bob'? 'Full': 'Limited');

Оператор последовательного выполнения <,> (также известный какоператор запятая) не является вполне логическим оператором, поскольку он не анализирует истинность своих операндов. Perl выполняет операнды оператора последовательного выполнения слева направо и возвращает значение самого правого операнда. Следующий пример иллюстрирует использование оператора запятая в цикле for.

For ($i=0, $j=10; $i<10; $i++, $j-)  {     print i$,' ',$j  }

СТРОКОВЫЕ ОПЕРАТОРЫ

Поскольку Perl представляет собой язык для обработки текста,неудивительно, что в него включены дополнительные операторы дляработы со строками. Ниже перечисляются операторы обработки строк:?. конкатенация строк? х репликация? =~ сопоставление переменной с образцом?!~ то же, что и предыдущее, но с дополненным отрицанием результата

Первые два оператора легко иллюстрируются примером:

print 'b'. 'an' x 2. 'a';  # выведет 'banana'

Как показано, это выражение использует конкатенацию строк иоператор репли-кации для того, чтобы напечатать строку <banana>.Два последних оператора используются для проверки того, включаетли строковый операнд заданный образец. Этот вопрос детально обсуждается в разделе <Регулярные выражения>. Следующий пример иллюстрирует их использование:

$var = 'banana'; print ($var =~ /ana/)? TRUE: FALSE;

В этом случае оператор проверки вхождения в строку образца(=~) использовался для проверки того, входит ли образец ana в переменную $var. В данном случае выражение принимает значение <истинно>.

ОПЕРАТОРЫ ПРИСВАИВАНИЯ

Если вы знакомы с языком программирования С, то формы операторов присваивания языка Perl должны быть для вас совершенно знакомыми. Так же как и в С, эти операторы заставляют Perl выполнить специальные операции со значениями, которые появились с правой стороны оператора, и затем выполнить присваивание:

= += -= *= /= %= |= &= ^= ~= <<= >>= **=.= x=

LVALUES В языке Perl, так же как и в С, lvalue представляет собойимя того, что стоит с левой стороны оператора присваивания. Таким образом, lvalue представляет собой целостность, которой может быть присвоено значение, например, lvalue может быть переменной. Например, скрипт Perl не может присвоить значение строкесимволов, наподобие выражения <Bob> = 32, поскольку <Bob> не является lvalue. Тем не менее, скрипт может присвоить значение переменной $Bob, например, следующим образом $Bob = 32, посколькупеременная $Bob является lvalue. В языке Perl любая целостность,которая может использоваться как lvalue, обычно таковой и является. Например, следующее выражение упаковывает (pack) и распаковывает (unpack) список значений, причем список переменных в первомслучае и три скалярных во втором являются lvalues:

  @color = ($r, $g, $b);   # пакет цветов  ($r, $g, $b) = @color;   # распаковка цвета

Когда вы работаете со списками в языке Perl, оператор присваивания не обяза тельно относится ко всему списку. Скрипт можетприсваивать значения отдельным элементам списка, как показано ниже:

  @items[2,4,7] = (100,200,300);

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

($arg1,$arg2,@rest) = @ARGV; # можно смешать скаляры и массивы

КОНСТРУКЦИИ ЯЗЫКА PERL

Perl поддерживает все выражения языка С, используя почтиидентичный их формат. Например, управляющие конструкции if,while, do. for и goto используются в обоих языках в одинаковойформе. Как вы увидите в дальнейшем, оператор continue имеет несколько иное значение в языке Perl. Его прежнее значение теперьназывают next, а оператор break называют теперь last. Perl нереализует оператор switch. Кроме того, некоторые выражения языкаС можно найти в Perl в иных форматах и добавлены многие новые выражения.

УСЛОВНЫЕ ОПЕРАТОРЫ

Многие предыдущие примеры использовали оператор if. В языкеPerl оператор if почти что идентичен оператору if в языке С.Отличие, однако, состоит в том, что в языке С оператор if можетиспользовать простую инструкцию без фигурных скобок, тогда как вязыке Perl инструкции обязательно должны быть заключены в фигурные скобки, образуя блок.

if (expr)  statement;      // приемлемо для C но не для Perl if (expr)  {      statement; # вот так нужно делать в Perl  }

Аналогичным образом инструкции языка Perl else работает немного отлично от соответствующей инструкции в С. В языке Perl инструкции также должны быть заключены в фигурные скобки и образовать блок:

// Пример в С неприемлемо в Perl if (expr1)  statament1; else if (expr2)  statement2; else  ststement3;

Ниже показано, что Perl позволяет использовать конструкциюelsif:

if (expr1) {  statament1; } elsif (expr2) {  statement2; } else {  ststement3; }

ОПЕРАТОР UNLESS

В языке программирования С программисты используют логическое отрицание (!) для изменения булевой величины на противоположное, как показано ниже:

if (!(expr)) // Отрицание на С {  statement; }

Наряду с использованием логического отрицания, скрипты Perlчасто содержат оператор unless, который обеспечивает то же самое,что и записанный выше код на С.

unless (expr) {  statement; }

Примечание: В отличие от языка С, Perl не содержит оператора переключения switch.

ОПЕРАТОР DO

Одним из частных случаев блочных операторов служит операторdo, который позволяет блоку инструкций возвращать значения. Значением, которое оператор do возвращает, является значение последнего выражения, оцененного в рамках блока. Например, следующийоператор do сравнивает строковую переменную $Month с месяцами года и присваивает переменной $DayCount значение, равное числу днейв месяце:

$DayCount = do { if ($Month eq 'September' || $Month eq 'April' || $Month eq 'June' || $Month eq 'November') {  30; } elsif ($Month eq 'Februry') {  $Year & 3? 28: 29; # Проверка на весокосный год } else {  31; }    };

Обратите внимание, что Perl требует наличия точки с запятойв конце блока do. Не путайте блок do с оператором do while, который будет рассматриваться ниже в этой главе.

ЦИКЛЫ И ВЕТВЛЕНИЯ

Perl поддерживает операторы циклов for, while и do с небольшими отличиями от их реализации в языке С. Существенным отличием служит то, что Perl требует использования инструкций блоками, заключенными в фигурные скобки. Кроме того, как вы познакомитесь, далее, Perl расширяет конструкцию цикла, что6ы обеспечитьее некоторые новые формы. В следующих примерах циклы for, while иdo работают аналогичным образом на языках С и Perl:

for($i = 0; $i< 100;$i++) { printf("%d\n", $i);   } while ($i > 0) {  printf("%d\n", $i-); } do { printf("%d\n", $i++); } while ($i < 0);

Конструкция циклов на языке С отлична от конструкции на языке Perl еще и в том, что Perl не содержит оператора break, а оператор continue выполняет совершенно иную функцию. К счастью, Perlобеспечивает некоторые новые, более гибкие и более интуитивно понятные конструкции:

? last выход из цикла (как оператор С break)? next начать новую итерацию (как оператор С continue)? redo повторить текущую итерацию

Для понимания конструкций циклов на языке Perl, необходимо разобраться с использованием блока continue. Рассмотрим следующий цикл while, который содержит блок continue:

$i = 100; while ($i > 0) { print $i; } continue {$i-}

Вы можете представлять себе блок continue как третье выражение в цикле for, которое выполняется на каждой итерации. Аналогичным образом Perl выполняет блок continue в конце каждой итерации. Однако, как вы узнаете далее, блок continue обеспечиваетскрипту более полный контроль над процессом, чем обеспечиваетцикл for. Когда цикл на языке Perl использует оператор next, блокcontinue все равно выполняется, если только он существует. Однако если цикл использует оператор redo, блок continue не исполняется.

МЕТКИ

В скрипте Perl метки просто означают имя, соответствующеенекоему положению внутри скрипта. Имена меток оканчиваются двоеточием (например, outerloop:). Используя оператор goto, скриптможет осуществлять переходы на метку. Дополнительно могут использоваться операторы last, next и redo, для перехода к метке.Следующий код иллюстрирует использование оператора last для перехода на метку:

outerloop: while ($i > 0)     {     while ($j > 0)      {             #Здесь какой-нибудь другой процесс             if ($needToAboutLoop)             {                 last outerloop;             }      }  }

В этом случае инструкция содержит ветвь last для перехода наметку outerloop и окончания выполнения цикла.

ЦИКЛ UNTIL

Еще одной конструкцией цикла в языке Perl является циклuntil, который является противоположностью циклу while. Как выпомните, в цикле while инструкции выполняются до тех пор, покавыполняется заданное условие. В цикле until, напротив, инструкции выполняются до тех пор, пока не будет выполнено условие. Например, рассмотрим цикл while, такой, как показан на следующейстранице.

while (!(expr))      {             statement;      }

Используя цикл until, можно создать идентичный цикл, показанный ниже:

  until (expr)  {      statement;  }

Аналогичным образом следующая конструкция do while использует оператор логического отрицания для того, чтобы выполнять цикл, пока заданное булево выражение не станет истинным:

do {  statement; } while (!(expr));

Используя конструкцию do until, вы можете сформировать идентичный цикл без использования логического отрицания:

do {  statement; } until (expr);

ЦИКЛЫ FOR И FOREACH

Perl поддерживает цикл for совершенно аналогично языку С:

for (statement1; expression; statement2) {  statement3; }

Например, следующий код использует цикл for для того, чтобывывести значения чисел от 0 до 100:

for ($digit = 0; $digit <=100; $digit++) {  print $digit, ' '; }

Дополнительно Perl содержит конструкцию цикла foreach, который позволяет скрипту организовывать итерации в списках и массивах. Рассмотрим пример:

@list = ('a','b','c'); foreach $arg (@list) {  print "List item: $arg\n"; } foreach $i (1..10) {  print "iteration $i\n" }

В первом случае цикл foreach осуществлял перебор значений всписочной переменной @list. Во втором примере в цикле foreachосуществляется перебор чисел в диапазоне от 1 до 10. Внутри цикла foreach может фигурировать список, состоящий излитералов, или массив, как было проиллюстрировано в предыдущемпримере. После выполнения одной итерации циклом, специальная скалярная переменная {$arg в первом случае и $i во втором случае)принимает значение из заданного списка элементов. Область видимости этой скалярной переменной в цикле foreach ограничиваетсятелом цикла. Поэтому скалярная переменная цикла, foreach не будет конфликтовать с идентичным именем переменной, определеннойвне цикла. В следующем коде переменная с именем $i используетсявнутри и вне цикла foreach:

  $i = 1001;  foreach $i (1..9)    {      print "$i\n";   # цикл выведет 123456789    }  print "$i\n";

Как можно увидеть из этого примера, переменная $i, используемая для организации итераций цикла, не конфликтует с переменной $i, определенной вне цикла. Особенностью цикла, foreach, которую ваши скрипты могут использовать, является возможность модификации элементов массива.(Будьте осторожны при реализации этой возможности!) Рассмотримследующий цикл foreach, который добавляет значение 10 каждомуэлементу массива:

@list = 1..5; foreach $i (@list) {  $i += 10; } $, = ' '; print @list; # выведет 11 12 13 14 15

Сделаем несколько заключительных замечаний относительно цикла foreach. В языке Perl имена foreach и for рассматриваются каксинонимы. Поэтому в скриптах можно использовать эти имена попеременно. Perl, в свою очередь, будет определять тип цикла, основываясь на его контексте.

МОДИФИКАТОРЫ ОПЕР<


Поделиться с друзьями:

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

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

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.014 с.