Пожалуйста, не могли бы вы объяснить это очевидно противоречивое поведение для меня:
use strict;
my @a;
print "a" x 2; # this prints: aa
@a = "a" x 2; print @a; # this prints: aa
print ("a") x 2; # this prints: a
@a = ("a") x 2; print @a; # this prints: aa
Разве последний не должен печатать один «а»?
Редактировать: Хорошо, так что теперь для меня это имеет больше смысла:
«Двоичный« x »является оператором повторения ... В контексте списка, если левый операнд заключен в скобки или является списком, сформированным из qw / STRING /, он повторяет список." perlop
Это так же ясно, как грязь для меня (двоичный х - зачем использовать слово двоичный? Есть ли динарный Х?)
Но в любом случае:
@a = ("a") x 2 #, кажется, находится в контексте списка, потому что у нас есть массив в начале - массив не является списком, но он содержит список, поэтому я думаю, что у нас, вероятно, есть контекст списка , (не контекст массива, хотя они могут быть синонимами).
Полагаю, «левый операнд» есть («а»). (Это либо это, либо @a). Perlop не говорит, что на самом деле является операндом, запрос perldoc.perl.org дает «Не найдено совпадений», а поиск в Google дает «В компьютерном программировании операнд - это термин, используемый для описания любого объекта, который способен манипулировать». Например, как массив.
Таким образом, левый операнд может быть заключен в квадратные скобки, поэтому, возможно, он должен «повторить список». Список либо: ("a") x 2
или это: ("a")
Если бы мы повторили ("a") x 2
, мы бы получили ("a") x 2 ("a") x 2
. Это кажется неправильным.
Если мы введем: print $a[1]
, мы получим один «a», поэтому «он повторяет список» означает, что Perl превращает ("a") x 2
в ("a", "a")
, поэтому мы эффективно получаем @a=("a", "a")
Однако print ("a") x 2
не превращается в ("a", "a")
. Это связано с тем, что print является «оператором списка» с высоким приоритетом. Таким образом, мы получаем: (print ("a")) x 2
Массив - это термин, поэтому он также имеет высокий приоритет, но @ a = stuff включает в себя оператор присваивания =, который имеет относительно низкий приоритет. Так что это сильно отличается от печати.