względu na kod:W jaki sposób Perl decyduje, która kolejność oceny terminów w wyrażeniu?
my $x = 1;
$x = $x * 5 * ($x += 5);
spodziewałbym $x
być 180
:
$x = $x * 5 * ($x += 5); #$x = 1
$x = $x * 5 * 6; #$x = 6
$x = 30 * 6;
$x = 180;
180;
Ale zamiast tego 30
; Jednak, jeśli mogę zmienić kolejność warunków:
$x = ($x += 5) * $x * 5;
ja rozumiem 180
. Powodem dla którego jestem zdezorientowany jest to, że perldoc perlop
mówi bardzo wyraźnie:
TERM ma najwyższy priorytet w Perlu. Obejmują one zmienne, operatory kwotowania i cytowań, dowolne wyrażenie w nawiasach i dowolną funkcję , której argumenty są nawiasami.
Ponieważ ($x += 5)
znajduje się w nawiasach, powinien być terminem, a zatem wykonywany jako pierwszy, niezależnie od kolejności wyrażenia.
Po pierwszym zapoznaniu się z C, nigdy nie robię takich rzeczy i oczekuję, że będą działać tak, jak powinienem: http://c-faq.com/expr/index.html ;-) –
Ja też pochodziłem z ANSI C, i tak, to nie jest kod, który bym napisał, to ja próbuję upewnić się, że rozumiem pierwszeństwo w Perlu, zanim wyjaśnię to komuś innemu. Korzystanie z efektów ubocznych, takich jak ten, jest głównym nie-nie, ale wciąż legalne w Perlu. W ANSI C, jeśli miałeś więcej niż jeden efekt uboczny w wyrażeniu, wyniki były niezdefiniowane, w Perlu efekty uboczne są lepiej zdefiniowane, ale nadal jest to naprawdę zły pomysł. –
Kiedyś zrobiłem piękny post o tym na comp.lang.perl.misc i nigdy nie udało mi się go znaleźć ponownie. –