Почему «print (52-80) * 42» отличается от «print 42 * (52-80)» в Perl? - PullRequest
3 голосов
/ 27 сентября 2010

Perl :: Что такое:

1. (52-80)*42
2. 42*(52-80)

Ans:

1. -28
2. -1176

Почему?

Получайте удовольствие, объясняя / оправдывая это, пожалуйста!

#!/usr/bin/perl
use strict;
print 42*(52-80) , "\n";
print ((52-80)*42) , "\n";
print (52-80)*42 , "\n";
print "\n";
my $i=(52-80)*42;
print $i, "\n";

Выход:

> -1176
> -1176-28
> -1176

Ответы [ 3 ]

24 голосов
/ 27 сентября 2010

Если вы добавите use warnings;, вы получите:

print (...) interpreted as function at ./test.pl line 5.
Useless use of a constant in void context at ./test.pl line 5
17 голосов
/ 27 сентября 2010

Предупреждение, на которое ссылается Алекс Ховански, означает, что

print (52-80)*42 , "\n"

анализируется как

(print(52-80)) * 42, "\n"

, то есть список, содержащий (1) 42-кратный результатфункция print(-28) и (2) строка, содержащая перевод строки.Побочным эффектом (1) является вывод значения -28 (без новой строки) на стандартный вывод.

Если вам нужно вывести выражение, начинающееся с круглых скобок, то для обхода этой проблемы необходимо добавить его с+:

print +(52-80)*42, "\n"         #  ==> -1176
6 голосов
/ 27 сентября 2010

Благодаря дурацким правилам парсинга в Perl (о, Perl, черт возьми!), Эти утверждения:

print ((52-80)*42) , "\n";
print (52-80)*42 , "\n";

интерпретируются так, как если бы они были написаны:

(print ((52-80)*42)), "\n";
(print (52-80))*42, "\n";

Вот почему вы видите -1176-28 на одной строке, а ожидаемая пустая строка отсутствует. Perl видит (print-expr), "\n"; и просто выбрасывает новую строку вместо печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...