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

perl

11274 просмотра

4 ответа

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

$ra = \$a; 
Автор: Roy Источник Размещён: 12.11.2019 09:29

Ответы (4)


18 плюса

Решение

Смотрите perlop .

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

Автор: Eugene Yarmash Размещён: 13.11.2010 04:37

25 плюса

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

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

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

Вы можете создать ссылку на любую именованную переменную или подпрограмму с обратной косой чертой. Вы также можете использовать его для анонимного скалярного значения, например 7или "camel", хотя вам это часто не нужно. Этот оператор работает как оператор &(address-of) в 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"

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

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

Автор: tchrist Размещён: 13.11.2010 05:23

4 плюса

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

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

Автор: Joel Berger Размещён: 13.11.2010 04:43

0 плюса

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

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

Разыменование выполняется через $$aскаляры, @$aмассивы и т. Д.

Автор: mfontani Размещён: 13.11.2010 04:40
Вопросы из категории :
32x32