2010-11-13 3 views
21

я в настоящее время изучение «разыменования» в Perl и нужна ваша помощь в понимании того, что «\» означает, что в строке ниже ..Что означает «» в Perl?

$ra = \$a; 
+4

Если вы в настоящее время узнав об этом, то, что ваши книги и учебные пособия говорят? – Ether

+2

мои лекционные заметки не уточнили, что это значит, что привело меня к поиску в google. не нашел satis ans, поэтому я спросил его здесь. – Roy

+1

@Roy: убедитесь, что вы выбрали правильный ответ. ☹ – tchrist

ответ

18

См perlop.

Унарный "\" создает ссылку на все, что следует за ним. См. perlreftut и perlref. Не путайте это поведение по поведению обратную косую черту в строке, хотя обе формы передают понятие , защищая следующую вещь от интерполяция.

+4

Собственно, или создает несколько ссылок на несколько вещей, следующих в контексте списка *, например, '' @r = \\ (@ a,% b, & c) 'и' @r = \ localtime'. – tchrist

+0

Когда есть обратная косая черта «\» в регулярном выражении или в строке, она называется ESCAPE, в противном случае она называется REFERENCE – jjpcondor

1

Он создает ссылку на переменную с правой стороны; вроде как указатель на C (без арифметики указателя) или указатель на Java.

См. perldoc perlref для получения более подробной информации по этому вопросу.

Dereferentiation осуществляется через $$a для скаляров, @$a для массивов и т.д.

+1

@tchrist. Этот ответ не является ошибочным. Это не полностью говорит вам, что делает, но вопрос не был «что делает оператор \ во всех случаях», это было «то, что означает« \ »в строке ниже». Строка ниже была '$ ra = \ $ a;', и в этой строке она создает ссылку на переменную справа. Ответ также указывает справочный документ, который полностью объясняет оператора. –

+0

@ Час. Оуэнс: это неполный ответ на название этого вопроса. – tchrist

+0

Хорошо, я полагаю, что в строке '$ ra = \ $ a;' ссылка на переменную с правой стороны не создается тогда: P – mfontani

4

документация Perl велик и тщательно, использовать его рано и часто. Могу ли я рекомендовать perldoc perlreftut, учебник по perl-ссылкам, или perldoc perlref для получения дополнительной информации. Впоследствии perldoc perlintro и perldoc perltoc или perldoc perl, чтобы посмотреть, куда идти.

И да, он создает ссылку на переменную $ a и сохраняет ее в переменной $ ra.

24

Как я уже в другом месте ранее списанный ...

Унарное \ создает ссылку на то, что следует за ним. Используется в списке, он создает список ссылок.

Не путайте это поведение с поведением обратного слэша внутри строки, хотя обе формы передают неопределенно негативное представление о защите следующей вещи от интерпретации. Это сходство не совсем случайно.

Вы можете создать ссылку на любую именованную переменную или подпрограмму с обратным слэшем. Вы также можете использовать его по анонимному скалярному значению, например 7 или "camel", хотя вам это не понадобится. Этот оператор работает как оператор & (адрес) в C или C⁺⁺ - по крайней мере, на первый взгляд.

Вот некоторые примеры:

$scalarref = \$foo; 
$constref = \186_282.42; 
$arrayref = \@ARGV; 
$hashref = \%ENV; 
$coderef = \&handler; 
$globref = \*STDOUT; 

Оператор обратный слэш может сделать больше, чем производить одной ссылки. Он будет генерировать целый список ссылок, если он применяется к списку.

Как упоминалось ранее, оператор обратной косой черты обычно используется для одного референта для создания единственной ссылки, но это необязательно. При использовании в списке референтов он выдает список соответствующих ссылок. Вторая строка в следующем примере делает то же самое, что и первая строка, так как обратная косая черта автоматически распространяется по всему списку.

@reflist = (\$s, \@a, \%h, \&f);  # List of four references 
@reflist = \($s, @a %h, &f);  # Same thing 

Если в скобках список содержит ровно один массив или хэш, то все его значений интерполируются и ссылки на каждый возвращенных:

@reflist = \(@x);     # Interpolate array, then get refs 
@reflist = map { \$_ } @x;   # Same thing 

Это также происходит, когда есть внутренние скобки:

@reflist = \(@x, (@y));    # But only single aggregates expand 
@reflist = (\@x, map { \$_ } @y); # Same thing 

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

Поскольку массивы и хэш-фрагменты действительно представляют собой списки, вы можете запрограммировать фрагмент любой из них, чтобы получить список ссылок. Каждая из следующих четырех строк делает то же самое:

@envrefs = \@ENV{"HOME", "TERM"};   # Backslashing a slice 
@envrefs = \@ENV{ qw<HOME TERM> };  # Backslashing a slice 
@envrefs = \($ENV{HOME}, $ENV{TERM}); # Backslashing a list 
@envrefs = (\$ENV{HOME}, \$ENV{TERM}); # A list of two references 

Поскольку функции могут возвращать списки, вы можете применить обратную косую черту к ним. Если у вас есть более одной функции для вызова, первый интерполировать возвращаемые значения каждой функции в в больший список, а затем обратную косую черту все это:

@reflist = \fx(); 
@reflist = map { \$_ } fx();    # Same thing 

@reflist = \(fx(), fy(), fz()); 
@reflist = (\fx(), \fy(), \fz());   # Same thing 
@reflist = map { \$_ } fx(), fy(), fz(); # Same thing 

Оператор обратной косой черты всегда снабжает контекст списка для операнда, поэтому эти функции все вызваны в контексте списка. Если обратный слэш сама в скалярном контексте, вы в конечном итоге со ссылкой на последнее значение в списке, возвращаемом функцией:

@reflist = \localtime();  # Ref to each of nine time elements 
$lastref = \localtime();  # Ref to whether it’s daylight savings time 

В связи с этим, обратный слеш ведет себя как в названном списке Perl операторы , такие как print, reverse и sort, которые всегда снабжают контекст списка справа от них, независимо от того, что может происходить слева. Как с именованными операторами списка, используйте явное scalar, чтобы заставить то, что следует в контексте скаляра:

$dateref = \scalar localtime(); # \"Sat Nov 13 10:41:30 2010" 

И теперь вы знаете ... в остальное истории.

(с извинениями покойного Пола Харви)

+2

Я просто использовал ссылку на DATA с \\ * DATA, чтобы использовать Шаблон :: Инструментарий с LaTeX. Я поместил раздел LaTeX в раздел DATA, а затем использовал ссылку на него как шаблон в 'process': Perl настолько классный. –

+2

Также спасибо за то, что \\ (...) распределяет, создавая ссылку ref для каждого элемента. Я бы предположил, что сделает ссылку на массив этого списка, но теперь это имеет смысл, в противном случае нам нужно [...] для. Спасибо –

+1

, что действительно всеобъемлющий, это tchrist. – Roy

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