Оператор -- в Perl

Оператор двойной минус используется в Perl для того чтобы уменьшить значение переменной на один.

Пример:

▶ Run
#!/usr/bin/perl

my $i = 100;

$i--;

print $i;

Программа выведет на экран число 99.

Формы записи

Существует две формы записи: можно указать оператор после переменной (постфиксная форма записи) или перед переменной (префиксная форма записи):

$i--;
--$i;

В том случае если команда находится одна на строчке, то нет разницы между префиксной и постфиксной формой записи. Разница есть только если оператор -- используется в составе какой-то команды. Если -- находится перед переменной, то значение переменной увеличится перед выполнением оставшейся команды. Если -- находится после переменной, то значение переменной увеличится после выполнения оставшейся команды.

Вот пример.

Вот эта программа выведет на экран числа 100 и 99:

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $i = 100;

say $i--;
say $i;

А вот эта программа выведет на экран число 99 два раза:

▶ Run
#!/usr/bin/perl

use feature qw(say);

my $i = 100;

say --$i;
say $i;

-- для строк

У оператора ++ есть специальная магия когда он применяется к переменной в которой находится строка.

У оператора -- такой магии нет. Строка приводится к числу и из этого числа вычитается единица.

Вот пример. Программы выведет на экран число -1

▶ Run
#!/usr/bin/perl

my $str = 'a1';

$str--;

print $str;

Вот несколько примеров что сделает оператор -- со строкой в переменной:

'a' -> -1
'100ABC' -> 99
'0100ABC' -> 99

Неправильное использование

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

▶ Run
#!/usr/bin/perl

my $i = 100--; # error!

При выполнении этой программы будет ошибка:

Can't modify constant item in postdecrement (--) at script.pl line 3, near "100--"
Execution of script.pl aborted due to compilation errors.

Точно так же его нельзя применять к массивам:

▶ Run
#!/usr/bin/perl

my @arr = (1, 2, 3);

@arr--; # error
Can't modify private array in postdecrement (--) at script.pl line 5, near "@arr--"
Execution of script.pl aborted due to compilation errors.

И к хешам:

▶ Run
#!/usr/bin/perl

my %h = (
    a => 1,
);

%h--; # error
Can't modify private hash in postdecrement (--) at script.pl line 7, near "%h--"
Execution of script.pl aborted due to compilation errors.

Другие статьи

Комментарии