Операции с массивами в Perl - PullRequest
0 голосов
/ 03 ноября 2010

Почему код ниже возвращает 11 с этим: - @myarray = ("Rohan");

Я получил следующее объяснение: - Выражение $ scalar x $ num_times, с другой стороны, возвращает строку, содержащую $ num_times копий $ scalar, соединенных вместе в строку. Так что должно давать 10, а не 11 ...
код как ниже: -

print "test:\n";
@myarray = ("Rohan"); # this returns 11
##@myarray = ("Rohan","G"); this returns 22
@myarray2 = (@myarray x 2);
@myarray3 = ((@myarray) x 2); #returns Rohan,Rohan and is correct

print join(",",@myarray2,"\n\n");
print join(",",@myarray3,"\n\n");

Ответы [ 2 ]

4 голосов
/ 03 ноября 2010

Происходит следующее: оператор x предоставляет скалярный контекст не только своему правому операнду, но и также своему левому и операнду - , если LHO окружен буквальным паренсом.

Это правило связано с обратной совместимостью с супер-древним кодом Perl, когда Perl вообще не понимал, что список является LHO. Это может быть v1 против v2, v2 против v3 или v3 против v4. Не могу вспомнить; это было очень давным-давно. Древнее наследие.

Так как массив из N элементов в скалярном контексте в N, то в вашем сценарии это делает N == 1 и "1" x 2 eq "11".

4 голосов
/ 03 ноября 2010

Perl делает именно то, что вы просили.В первом примере массив находится в скалярном контексте и возвращает его длину.затем он соединяется сам с собой дважды.Во втором примере у вас есть массив в контексте списка, и оператор x повторяет список.

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