Оператор унарный минус - в Perl

Число

В том случае если унарный минус применяется к числу или к строке в которой содержится число, то результат работы — это число с противоположенным знаком (кроме ситуации с нулем, про это в следующем разделе).

Вот пример. Этот код выведет на экран -3 (никакой ошибки и никакого предупреждения не будет):

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

print -'3';

Причем это -3, которое мы получили — это именно число -3, а не строка '-3'.

Ноль

Если применить унарный минус к числу 0 или строке '0', то результат будет число 0.

Bareword

Если применить унарный минус к идентификатору, то результат будет строка состоящая из минуса и этого идентификатора. В данном примере в переменной $var оказывается строка '-asdf'. Никаких ошибок и предупреждений нет.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = - asdf;

print $var;

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

▶ Run
#!/usr/bin/perl

my $var = - 3asdf;

print $var;

Этот код выдаст ошибку:

Bareword found where operator expected at script.pl line 3, near "3asdf"
    (Missing operator before asdf?)
syntax error at script.pl line 3, near "3asdf"
Execution of script.pl aborted due to compilation errors.

Строка с числом, которая начинается с символа + или -

Вот пример кода:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

print -'+44', "\n";
print -'-44', "\n";

Результат работы этого кода зависит от версии Perl. 5.8, 5.10, 5.12 выведет на экран в первой строчке -44, а во второй +44. Начиная с 5.14 во второй строке будет 44 уже без плюса.

А вот такой пример кода, вообще имеет 3 разных варианта работы, в зависимости от версии Perl:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

print -'+0', "\n";
print -'-0', "\n";

5.8, 5.10, 5.12 выведет на экран -0, +0, Версии 5.14 и 5.16 выведет на экран два нуля. А начиная с 5.18 на экране будет -0 и 0.

Строка, которая начинается с символа + или -

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

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

print -"+asdf\n";
print -"-asdf\n";

Программа выведет на экран:

-asdf
+asdf

Строка, которая не начинается с символа + или -

В такой ситуации Perl попробует преобразовать строку в число.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

print -'3.8asdf';

Результат работы кода выше — это предупреждение и число -3.8:

Argument "3.8asdf" isn't numeric in negation (-) at script.pl line 6.
-3.8

Официальная документация

Вот фрагмент вывода команды perldoc perlop про унарный минус:

    Unary "-" performs arithmetic negation if the operand is numeric,
    including any string that looks like a number. If the operand is an
    identifier, a string consisting of a minus sign concatenated with the
    identifier is returned. Otherwise, if the string starts with a plus or
    minus, a string starting with the opposite sign is returned. One effect of
    these rules is that "-bareword" is equivalent to the string "-bareword".
    If, however, the string begins with a non-alphabetic character (excluding
    "+" or "-"), Perl will attempt to convert the string to a numeric, and the
    arithmetic negation is performed. If the string cannot be cleanly
    converted to a numeric, Perl will give the warning Argument "the string"
    isn't numeric in negation (-) at ....

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

Комментарии