2013-04-25 1 views
0

какова разница между -> и $ в Perl

где -> является инфикс оператор разыменования.

$ также является оператором разыменования.

Что именно означает этот оператор?

+2

Я не уверен, почему люди этого не делают. Это правильный вопрос. –

+0

@ D.Shawley, если это правильный вопрос, почему бы вам не продвинуться дальше? (Люди ИМО не слишком занимают вопросы) –

+0

некоторые полезные ссылки. [Мини-учебник: синтаксис разыменования] (http://www.perlmonks.org/?node_id=977408), [Ссылки по ссылке] (http://www.perlmonks.org/?node_id=69927), [perlref] (http://perldoc.perl.org/perlref.html), [perlreftut] (http://perldoc.perl.org/perlreftut.html), [perldsc] (http://perldoc.perl.org/perldsc .html), [perllol] (http://perldoc.perl.org/perllol.html) – ikegami

ответ

0

Мой Perl немного ржавый, но $всегда означает следующее имя скалярной. Оператор стрелки (->) - совсем другой зверь. Это означает, что разыменовывают имя и затем применяют следующие операторы. Ниже приведен пример из perlref(1):

Из-за того, чтобы быть в состоянии опустить Curlies для простого случая $$x, люди часто делают ошибку просмотра Разыменования символов как собственные операторы, и интересно об их приоритете , Если бы они были, вы могли бы использовать круглые скобки вместо брекетов. Это не так. Рассмотрим разницу ниже; Случай 0 является стенографией версии корпуса 1, не случай 2:

$$hashref{"KEY"} = "VALUE";   # CASE 0 
${$hashref}{"KEY"} = "VALUE";  # CASE 1 
${$hashref{"KEY"}} = "VALUE";  # CASE 2 
${$hashref->{"KEY"}} = "VALUE";  # CASE 3 

Случай 2 также обманчиво, что вы обращаетесь к переменному с именем %hashref, не разыменованием через $hashref в хэш это, по-видимому, ссылки. Это будет случай 3.

+0

$ - это не то, что сигнализирует имя переменной скаляра, и есть другие виды использования $ помимо сигилы. –

7

Я не могу рекомендовать достаточно подробный учебник по документации по документации, perldoc perlreftut, написанный уважаемым прохожим Маркером Джейсоном Доминисом. Это краткое изложение и содержит несколько простых правил для создания и использования ссылок.

Я не говорю, что RTFM, я говорю, есть замечательный документ по этому вопросу, ищите его, это поможет вам!

+2

Вы говорите RTM :) – DVK

+0

Я думаю, что я, но я говорю это с улыбкой :-) –

4

Да, оба $ и -> являются операторами разыменования, хотя они совершенно разные.

Perl позволяет использовать ссылки другие данные. Они примерно похожи на указатели на некоторых языках. Чтобы получить исходную структуру данных, мы должны указать dereference. Обычно это касается фигурных скобок (которые можно опустить в тривиальных случаях) и сигилы типа, с которым мы разыгрываем. (Большинство значений могут быть разыменованы только одним типом, иначе возникает ошибка).

${ $scalar_ref }; 
@{ $array_ref }; 
%{ $hash_ref }; 
*{ $glob_ref }; 
&{ $code_ref }(@args); 

Если $type_ref это просто переменная, то Curlies могут быть опущены, но они практичны, когда у нас есть более сложные выражения.

Теперь проблема заключается в доступе к полям в хэшах или массивах, не присваивая промежуточному хешу. Здесь используется оператор ->:

# instead of 
my %hash = %{ $hashref }; 
my $field = $hash{field}; 
# we can do this and avoid unneccessary copying :) 
my $field = ${$hashref}{field}; # curlies around $hashref optional 
my $field = $hashref->{field}; 

Похожие для массивов, coderefs и метод вызывает на объектах:

$array_ref->[$index]; $$array_ref[$index]; 
$code_ref->(@args);  &$coderef(@args); 
$object->method(@args); 

На самом деле, то, что оператор -> делает в контексте вызовов методов (или то, что похоже на них) немного сложнее, но это не похоже на вопрос вашего вопроса.

Для arrayrefs и hashrefs, вы можете просто представить себе, что $$ref[$i] -как разыменовать просто заменяет $ref с именем массива, который он делает в символическом смысле: $array[$i]. Таким образом, первый сингл $ - это элемент массива, а второй $ - скаляр, содержащий ссылку.

Смежные вопросы