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

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

23 голосов
/ 13 ноября 2010

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

$ra = \$a; 

Ответы [ 4 ]

25 голосов
/ 13 ноября 2010

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

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

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

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

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

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

18 голосов
/ 13 ноября 2010

См. perlop .

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

4 голосов
/ 13 ноября 2010

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

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

0 голосов
/ 13 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...