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

Однако в некоторых случаях может понадобиться остановить выполнение раньше.

Например, вы спрашиваете пользователя о его возрасте, и если он младше 13, останавливаете скрипт.

use strict;
use warnings;
use 5.010;

print "Каков ваш возраст? ";
my $age = <STDIN>;
if ($age < 13) {
    print "Вы слишком молоды\n";
    exit;
}

print "Сделаем что-то...\n";

Обычный вызов exit.

Код выхода

Если вы пользуетесь командной оболочкой Unix/Linux, то вы, должно быть, знаете, что каждая программа при выходе передает код выхода, который можно узнать из переменной $?. Вы тоже можете передать такой код выхода из perl-скрипта, указав параметр при вызове exit().

use strict;
use warnings;
use 5.010;

exit 42;

В этом примере мы установили код выхода 42. (По умолчанию устанавливается 0)

Успех или отказ?

В Perl обычно 0 или undef означает отказ, а какое-нибудь истинное значение означает успех.

В мире командной оболочки Unix/Linux, 0 означает успех, а другие числа означают отказ. Как правило, для каждого приложения существует свой набор значений, каждое из которых означает какую-то ошибку.

Проверка кода выхода в Linux

На Unix/Linux обычно запускают скрипт через perl script.pl, и потом можно проверить код выхода через echo $?.

Проверка кода выхода в Perl

Если вам приходится запускать один скрипт perl из другого, например через вызов функции system, код выхода этой «другой программы» попадет в переменную Perl'а $?.

Если вы сохраните код из примера выше в файл script.pl, и создадите другой файл «executor.pl» с таким кодом:

use strict;
use warnings;
use 5.010;

say system "perl script.pl";
say $?;
say $? >> 8;

То вывод будет таким:

10752
10752
42

Вызов system вернет код выхода, и он же будет записан в переменную Perl'а $?. Здесь важно упомянуть, что это значение состоит из двух байт, и собственно код выхода записан в верхнем байте. Так что, чтобы получить наше 42, нужно сдвинуть биты полученной переменной вправо на 8, использовав побитовый оператор >>. Это мы и видим в последней строке примера.