вопрос по перлу

oyuriyu

Почему
print ("a", "b")[1];
не работает, надо писать
print "a", "b")[1]);
а
print qw(a, b)[1];
срабатывает на ура ? В книге http://www.perl.org/books/beginning-perl/
написано, что print имеет более высокий приоритет, чем [1], и нужны скобки. Но ведь qw(a, b) точно такой же list как и ("a", "b").

oyuriyu

видимо в книге лажа написана

buka

1. a * b + c =/= a * (b + c омг! ведь если заменить «b + c» на «d» получится a * d =/= a * (d вот это парадокс!
2. qw(a, b) — это "a,", "b"

Geddi-S

Просто если после оператора (в данном случае print) стоит левая скобка (после, может быть, пробельных символов то то, что стоит в скобках, трактуется как аргумент оператора, поэтому сначала выполняется оператор со своими аргументами (print ("a", "b" после чего от результата выполнения print пытаеся взять второй элемент, что есть ересь
Во втором же случае такого не происходит, посколько сначала вычисляется qw, потом [1], и уж потом print.
Вот такое развернутое пояснение того, что сказал
P.S. Кстати, попробуй print (qw(a b[1], тоже будешь удивлен
P.P.S. Да, кстати, если не хочешь, чтобы скобки после print (да и любого оператора) воспринимались как содержимое его аргументов, просто поставь перед первой скобкой "+", например, print +("a", "b")[1];

oyuriyu

спасибо

wwoland

Кстати, а [] или индексирование массива это тоже оператор?
Если да, то где он находится в таблице приоритетов?

pitrik2

клева написал
напрашивается ответ на изначальный пост: это же очевидно

Geddi-S

По поводу приоритетов и списочных операторов (таких, как print, sort etc) нашел хорошую цитату:
Если мы явно не выделяем параметры списковой операции, заключая их в скобки, то все стоящие справа от нее в выражении и разделенные запятыми величины рассматриваются как фактические параметры этой операции.
Т.е. сначала вычисляем все аргументы списочного оператора print (чем и является, например, qw(a b)[1] после чего применяем оператор ко всем вычисленным аргументам.
Поэтому здесь, имхо, более тонкий момент, чем просто таблица приоритетов. Саму же таблицу можно найти где угодно.
Или вот что пишут в кэмел-бук:
Если за списковым оператором (например, print) или любым именованным унарным оператором (например, chdir) в качестве следующей лексемы следует левая круглая скобка (не считая пробельных символов то оператор и аргументы в скобках получают наивысший приоритет, как если бы это был обычный вызов функции. Правило следующее: если это похоже на вызов функции, то это и есть вызов функции
Так что, думаю, то, что в книжке пишут про сравнение приоритета [] и print - имхо, не по теме.
P.S. Если не прав, не судите строго, я сам только учусь

wwoland

Читал я тут недавно Кэмэл Бук как раз по этому поводу.
И про списковые операторы понятно, что они стараются отожрать весь список за собой
Меня больше волнует именно "[]", то есть что это : оператор или что?
и каков у него приоритет, тк в кэмэл буке в таблице приоритетов я не нашел индекса массива или хеша
Оставить комментарий
Имя или ник:
Комментарий: