Нет, но следующие значения эквивалентны:
${"_<$filename"} # When this expression is found in package main
${"::_<$filename"}
${"main::_<$filename"}
${ $::{"_<$filename"} }
${ ${'::'}{"_<$filename"} }
${ $main::{"_<$filename"} }
${ ${'main::'}{"_<$filename"} }
Они относятся к переменной в корневом / главном пространстве имен, имя которой создается "_<$filename"
.
В качестве более ясного примера, все нижеприведенные значения эквивалентны (при условии, что код скомпилирован в пакет Foo::Bar
для первых двух):
@moo # Via hardcoded, unqualified name
@{'moo'} # Via symref using unqualified name
@Foo::Bar::moo # Via hardcoded, qualified name
@{'Foo::Bar::moo'} # Via symref using qualified name
@{ *Foo::Bar::moo } # Via hardcoded glob
@{ *{'Foo::Bar::moo'} } # Via symref to glob
@{ $Foo::Bar::{moo} } # Via glob via hardcoded package
@{ ${'Foo::Bar::'}{moo} } # Via glob via symref to package
@{ $Foo::{'Bar::'}{moo} } # Via glob via hardcoded parent package
@{ ${'Foo'}::{'Bar::'}{moo} } # Via glob via symref to parent package
@{ $::{'Foo::'}{'Bar::'}{moo} } # Via glob via root package
@{ $main::{'Foo::'}{'Bar::'}{moo} } # Same
Perl позволяет использовать имена символов в качестве ссылок.
$ perl -e'%h = ( a => 4, b => 5 ); my $ref = "h"; CORE::say $ref->{a};'
4
Они называются "символическими ссылками" (и они не разрешены при использовании use strict;
). Следующее использует main::
как символическую ссылку:
${ 'main::' }{ "_<$filename" }
Однако делать это бессмысленно. Так как имя переменной в любом случае жестко закодировано, мы могли бы также использовать следующее:
$main::{ "_<$filename" }
Мало того, что это проще, это разрешено при использовании use strict;
.
Но что такое %main::
? Ну, это таблица символов для пакета main
. Ключи %main::
- это имена символов (переменных), которые существуют в пакете main
(без каких-либо символов).
Значения %main::
являются записями таблицы символов. Мы называем это "typeglobs", или "globs" для краткости. Разыменование глобуса, как если бы это была ссылка, обращается к переменной типа, соответствующего разыменованию. Например,
$main::{a}
возвращает
*main::a # A glob
и
${ $main::{a} }
возвращает
$main::a
Это означает, что следующее возвращает глобус к переменной в пространстве имен main
, имя которого создается "_<$filename"
$main::{ "_<$filename" }
Основным пространством имен является также корневое пространство имен. Это означает, что
$main::a
и
$::a
оба ссылаются на одну и ту же переменную. Это также означает, что
%main::
и
%::
оба ссылаются на одну и ту же переменную. Это также означает, что
$main::{ "_<$filename" }
и
$::{ "_<$filename" }
оба возвращают один и тот же глобус.
Мы установили, что следующее возвращает глобус для символа в корневом / главном пространстве имен, имя которого создается "_<$filename"
$::{ "_<$filename" }
Мы также установили, что следующие ссылки ссылаются на скаляр в корне / main, имя которого создается "_<$filename"
:
${ $::{ "_<$filename" } }
И, наконец, мы также установили, что следующее является символической ссылкой, которая ссылается на тот же скаляр:
${ "::_<$filename" }