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

Что означает "\" в Perl?

В настоящее время я изучаю "разыменование" в Perl и нуждаюсь в вашей помощи в понимании того, что означает "\" в строке ниже.

$ra = \$a; 
4b9b3361

Ответ 1

См. perlop.

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

Ответ 2

Как я уже упоминал ранее...

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"

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

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

Ответ 3

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

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

Ответ 4

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

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

Выделение производится с помощью $$a для скаляров, @$a для массивов и т.д.