Как я уже писал ранее…
Унарный \
создает ссылку на все, что следует за ним.Используемый в списке, он создает список ссылок.
Не путайте это поведение с поведением обратной косой черты в строке, хотя обе формы передают смутно отрицательное понятие защиты следующей вещи от интерпретации.Это сходство не является случайным.
Вы можете создать ссылку на любую именованную переменную или подпрограмму с обратной косой чертой.Вы также можете использовать его для анонимного скалярного значения, такого как 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"
И теперь вы знаете ... остальные истории.
(с извинениями покойному Полу Харви)