В настоящее время я изучаю "разыменование" в Perl и нуждаюсь в вашей помощи в понимании того, что означает "\" в строке ниже.
$ra = \$a;
В настоящее время я изучаю "разыменование" в Perl и нуждаюсь в вашей помощи в понимании того, что означает "\" в строке ниже.
$ra = \$a;
См. perlop.
Унарный "\" создает ссылку на что следует за ним. См. perlreftutи perlref. Не путайте это поведение с поведением обратная косая черта внутри строки, хотя обе формы передают понятие защита следующей вещи от интерполяция.
Как я уже упоминал ранее...
Unary \
создает ссылку на все, что следует за ней. Используется в списке, он создает список ссылок.
Не путайте это поведение с поведением обратной косой черты внутри строки, хотя обе формы действительно передают неопределенно негативное представление о защите следующей вещи от интерпретации. Это сходство не является случайным.
Вы можете создать ссылку на любую именованную переменную или подпрограмму с обратным слэшем. Вы также можете использовать его для анонимного скалярного значения, такого как 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"
И теперь вы знаете... отдых истории.
(с извинениями покойного Пола Харви)
Документация Perl великолепна и тщательна, используйте ее как можно раньше и часто. Могу ли я рекомендовать perldoc perlreftut
, учебник по perl-ссылкам или perldoc perlref
для получения дополнительной информации. Затем perldoc perlintro
и perldoc perltoc
или perldoc perl
, чтобы увидеть, куда идти оттуда.
И да, он создает ссылку на переменную $a и сохраняет ее в переменной $ra.
Он создает ссылку на переменную с правой стороны; вроде как указатель на C (без арифметики указателя) или указатель на Java.
См. perldoc perlref для получения более подробной информации по этому вопросу.
Выделение производится с помощью $$a
для скаляров, @$a
для массивов и т.д.