Поиск

Другие операторы

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

Унарные операторы

До сих пор все встречавшиеся вам операторы имели по два аргумента. Для деления 6/3 нужен числитель б и знаменатель 3, для умножения 5*2 нужны множители 5 и 2 и т.д. Другой тип операторов — операторы с одним аргументом (операндом). Скорее всего, вы уже знакомы с одним представителем операторов такого рода — унарным минусом (-). Унарный минус изменяет знак своего аргумента, например:

6; | Шесть
-6 | Минус шесть
-(-5) | Пять, минус на минус дает плюс.

В отличие от унарного минуса, большинству операторов Perl назначены имена. Операнды именованных унарных операторов заключать в скобки необязательно (в табл. 2.4 они приведены лишь для удобства). Поскольку именованные операторы в Perl напоминают функции, то их операнды иногда называют аргументами, т.е. термином, принятым для параметров функций Perl.

Краткий список именованных операторов приведен в табл. 2.4.

Полный список именованных операторов приведен в документации по Perl. На 1-м занятии, "Начало работы с Perl", рассказывалось о том, как получить доступ к разделам документации с помощью утилиты perldoc, которая входит в поставку Perl. Полный список операторов находится на страницах руководства perlop и perlfunc. На последующих занятиях, по мере необходимости, будут представлены и некоторые другие операторы.

Инкремент и декремент

В разделе "Числовые операторы" мы уже говорили о специальном типе операторов присваивания, называемом инкрементом, выглядевшем тогда так:

$counter=$counter+l;

Инкремент обычно используется для подсчета чего-либо, например количества встретившихся записей или для генерации последовательных номеров (например, нумерации элементов списка). Вы можете в этих целях использовать специальный оператор, называемый оператором автоинкремента (++). Этот оператор прибавляет к операнду единицу:

$counter++;

После выполнения этой строки кода значение переменной $counter увеличивается на единицу.

В Perl есть оператор для уменьшения значения переменной, который, как вы уже могли сами догадаться, называется оператором автодекремента (--). Автодекремент используется точно так же, как и автоинкремент:

$countdown=10;
$countdown-—; | Значение переменной становится равным 9

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

$а="999";
$а++;
print $a; | как и следовало ожидать, напечатает 1000.

$а="с9";
$а++;
print $а; | напечатает dO. 9+1=10, с заменяется следующим символом алфавита d.

$a="zzz";
$а++;
print $a; | напечатает аааа.
Оператор автодекремента не выполняет подобных действий.
Угловой оператор

Угловой оператор (о), иногда из-за своей формы называемый "бубновым", прежде всего, используется для чтения и записи файлов (подробнее об этом речь пойдет на 5-м занятии, "Работа с файлами"). Однако, чтобы сделать примеры более интересными, мы начнем его использовать раньше, и к 5-му занятию он уже будет нам хорошо знаком.

А пока мы будем использовать простейшую форму углового оператора: <STDIN>. Эта конструкция сообщает Perl, что строка должна быть считана со стандартного устройства ввода — обычно с клавиатуры. Таким образом, оператор <STDIN> возвращает строку, введенную с клавиатуры, например:

print "Какой у вас размер обуви? ";
$size=<STDIN>;
print "Ваш размер обуви ~ ${size}Спасибо за внимание";

После выполнения этого кода (предположим, что в качестве размера обуви вы указали число 45) на экран будет выведено следующее:

Какой у вас размер обуви? 45
Ваш размер обуви — 45 Спасибо за внимание

Оператор <STDIN> читает вводимые с клавиатуры символы до тех пор, пока пользователь не нажмет клавишу <Enter>. Затем введенная строка помещается в переменную Ssize. Строка текста, возвращаемая оператором <STDIN>, содержит символ перевода строки, введенный пользователем при нажатии клавиши <Enter>. Обычно не желательно, чтобы в конце введенной строки находился символ перевода строки, т.е. требуемая строка должна содержать лишь текст. Для удаления символа перевода строки можно воспользоваться оператором chomp:

print 'Какой у вас размер обуви? ";
$size=<STDIN>;
chomp $size;
print "Ваш размер обуви — $size. Спасибо за вниманиеn";

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

Другие операторы присваивания

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

переменная оператора выражение

Эта строка равносильна следующей: переменная= переменная оператор выражение

Использование подобных операторов обычно не сделает вашу программу более читабельной, но сделает ее короче. Согласно вышеописанному правилу, оператор

$а=$а+3;

можно сократить до

$а+=3; . .

А вот еще несколько примеров:

$line.=" - это конец строки"; | Фраза дописывается к $line;
$у*=$х | To же, что и $у=$у*$х
$r%=67 | Остаток от деления $r на 67 помещается в $r
Несколько слов о строках и числах

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

  • Если из строки можно без проблем вьщелить число, Perl использует число, например: $а=42; | Число
    print $a+18; | Печатает 60
    $Ь="50"; | Строка
    print $b-10; | Печатает 40
  • Если число используется в строковом выражении, Perl преобразовывает число в строку, например: . . $а=42/3; | Число
    $а=$а, "Hello"; | Используется число как строка
    Print $a; | Печатает "14Hello"
  • Если в выражении строка используется там, где должно быть число, Perl использует число 0, например: $a="Hello, World!";
    print $a+6; | Печатает число 6

Однако, если включен режим вывода предупреждений, в последнем случае Perl выдаст соответствующее сообщение.

Все эти примеры иллюстрируют философию, свойственную Perl, — философию "минимальной неожиданности". Даже получив абсурдные аргументы, как в предыдущем примере, Perl пытается сделать с ними нечто осмысленное. Если вы включили режим вывода предупреждений, указав ключ -v в первой строке вашей программы или в командной строке, Perl предупредит вас, что совершает бессмысленное действие, следующим сообщением: Argument X isn't numeric.