Подтвердить что ты не робот

Что делает стрелка → в Perl?

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

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

Что делает эта линия? Кроме того, где я могу, возможно, прочитать об этом?

4b9b3361

Ответ 1

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

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

В противном случае правая сторона - это имя метода или простая скалярная переменная, содержащая либо имя метода, либо ссылку на подпрограмму, а левая сторона должна быть либо объектом (блаженной ссылкой), либо именем класса (то есть имя пакета). См. perlobj.

Ответ 2

В общем случае -> указывает на разыменование. Этот синтаксис исходит от C.

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

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

Ответ 3

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

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

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

Ответ 4

Оператор стрелки Perl имеет одно другое применение:

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

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