В том случае если унарный минус применяется к числу или к строке в которой содержится число, то результат работы — это число с противоположенным знаком (кроме ситуации с нулем, про это в следующем разделе).
-
в Perl
В том случае если унарный минус применяется к числу или к строке в которой содержится число, то результат работы — это число с противоположенным знаком (кроме ситуации с нулем, про это в следующем разделе).
Вот пример. Этот код выведет на экран -3
(никакой ошибки и никакого
предупреждения не будет):
#!/usr/bin/perl
use strict;
use warnings;
print -'3';
Причем это -3
, которое мы получили — это именно число -3
, а не строка '-3'
.
Если применить унарный минус к числу 0
или строке '0'
, то результат будет число 0
.
Если применить унарный минус к идентификатору, то результат будет строка состоящая из минуса и этого
идентификатора. В данном примере в переменной $var
оказывается строка '-asdf'
. Никаких ошибок и
предупреждений нет.
#!/usr/bin/perl
use strict;
use warnings;
my $var = - asdf;
print $var;
Идентификатор должен начинаться с символа подчеркивания или с буквы. Вот код, который использует цифру в качестве первого символа:
#!/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.
+
или -
Вот пример кода:
#!/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:
#!/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
.
+
или -
В том случае если применить унарный минус к строке, которая начинается с плюса или минуса, то результат будет строка, которая начинается с другого символа. Вот пример:
#!/usr/bin/perl
use strict;
use warnings;
print -"+asdf\n";
print -"-asdf\n";
Программа выведет на экран:
-asdf
+asdf
+
или -
В такой ситуации Perl попробует преобразовать строку в число.
#!/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 ....