Что делает стрелка -> в Perl? - PullRequest
32 голосов
/ 06 февраля 2011

Я продолжаю видеть -> в коде, и я не совсем уверен, что это значит. Например:

@top_links = @{$m->links};

Что делает эта строка? Кроме того, где я могу прочитать об этом?

Ответы [ 4 ]

35 голосов
/ 06 февраля 2011

См. Оператор стрелки в perlop:

"->" - это оператор разыменования инфикса, как и в C и C ++.Если правая сторона является индексом [...], {...} или (...), то левая сторона должна быть жесткой или символической ссылкой на массив, хеш или подпрограмму соответственно.(Или, технически говоря, местоположение, способное содержать жесткую ссылку, если для присвоения используется ссылка на массив или хеш.)В противном случае правая сторона - это имя метода или простая скалярная переменная, содержащая либо имя метода, либо ссылку на подпрограмму, а левая сторона должна быть либо объектом (благословенная ссылка), либо именем класса (то есть именем пакета).,См. perlobj .

13 голосов
/ 06 февраля 2011

В общем, -> намекает на разыменование.Этот синтаксис взят из C.

В вашем примере это означает вызов метода: вызов метода links из экземпляра объекта в $m.Это объясняется в главе Объекты в Modern Perl .Кусочки perlsub , perlfaq7 , perlobj , perltoot предоставляют подробности

Для ссылок в целом, search Stack Overflow ;это повторяющаяся тема.

3 голосов
/ 06 февраля 2011

Внешняя @{} часть является разыменованием - это означает, что $m->links является ссылкой на массив, поэтому этот оператор обращается к ней для прямой ссылки на массив, который затем копируется в @top_links

Глава 8 ' Camel Book ' - это хорошее место, чтобы узнать о ссылках, или раздел perlref документации Perl.

Оператор стрелки -> является разыменованием объекта, в данном случае извлекает член links объекта $m. Аналогичным образом, в последующих главах «Книги верблюдов» подробно описывается объектно-ориентированная поддержка Perl. См. Также раздел perlobj документации Perl.

2 голосов
/ 25 сентября 2017

Perl arrow оператор имеет еще одно использование:

Class-> метод вызывает метод подпрограммы в пакете Class

хотя он полностью отличается от вашего примера кода. Включая его только для полноты вопроса в заголовке.

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