Порядок выполнения `shift` в уравнении Perl - PullRequest
1 голос
/ 15 октября 2019

Для демонстрации моего вопроса рассмотрим следующий код Perl:

use strict;
use warnings;
use Data::Dumper;

my @a = (1, 2);
my %h;

sub test {
  $h{shift @_} = shift;
}

&test(@a);
print Dumper(%h);

Вывод IS выглядит следующим образом:

$ VAR1 ='2';

$ VAR2 = 1;


Почему Perl выполняет первую shift с правой стороны уравнения, а не с левой?

Почему вывод НЕ как следующий?

$ VAR1 = '1';

$ VAR2 = 2;

1 Ответ

4 голосов
/ 15 октября 2019

В большинстве языков порядок оценки операндов для большинства операторов не определен или, по крайней мере, недокументирован. [1] Perl не является исключением.

f() + g() вызывает f() или g() первый? Ну, это недокументировано и предположительно не определено.


Теперь получается, что perl в настоящее время очень непротиворечиво. Бинарные арифметические операторы всегда будут оценивать свой левый операнд перед правым операндом (включая **, который является ассоциативным справа), в то время как скалярный оператор присваивания и оператор присвоения списка оценивают свой операнд RHS перед своим операндом LHS.


  1. Заметные исключения включают оператор запятой в скалярном контексте и операторы короткого замыкания.

    Оператор запятой в скалярном контексте задокументирован для оценки его LHSдо его RHS, хотя такая гарантия не предоставляется, когда она вызывается в контексте списка.

    Операторы короткого замыкания - а именно &&, ||, and, or и условный оператор - должныобязательно оцените их LHS перед любым другим операндом.

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