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

Perl $$ var - два знака доллара в качестве сигилы?

Это похоже на то, что я должен быть в состоянии легко Google, Bing или DDG, но я полностью опустел на все.

В принципе, мне поручено (частично) переписать набор старых скриптов Perl. Не будучи самим программистом Perl, определенно есть кривая обучения при чтении этих сценариев, чтобы выяснить, что они делают, но я ударил абсолютную кирпичную стену с такими линиями, как этот:

$comment = $$LOC{'DESCRIPTION'};

Рядом, как я могу судить, правая часть - это словарь, или, точнее, получение значения, на которое ссылается ключ 'DESCRIPTION' в указанном словаре. Но что с "лишним" знаком доллара перед ним?

Он выглядит подозрительно, как PHP переменные переменные, но после очистки поисковых систем, сортированных сайтов StackExchange и perlvar Я не могу найти никаких указаний на то, что Perl даже имеет такую ​​функцию, не говоря уже о том, что так оно и происходит. Самое большее, что я обнаружил, это то, что "$" не является допустимым символом в имени переменной, поэтому я знаю, что $$LOC - это не просто вызов переменной, которая просто называется $LOC.

Что это за дополнительный знак доллара здесь?

4b9b3361

Ответ 1

Это альтернативная форма разыменования. Может (и, честно говоря, вероятно, должен) быть записан как:

$LOC->{'DESCRIPTION'};

Иногда вы увидите то же самое с другими основными типами данных:

my $str = 'a string';
my %hash = (a => 1, b => 2);
my @array = (1..4);

my $strref = \$str;
my $hashref = \%hash;
my $arrayref = \@array;

print "String value is $$strref\n";
print "Hash values are either $$hashref{a} or $hashref->{b}\n";
print "Array values are accessed by either $$arrayref[0] or $arrayref->[2]\n";

Ответ 2

Dereferencing обрабатывает скаляр как "адрес", в котором вы можете найти другую переменную (скаляр, массив или хэш) и ее значение.

В этом случае $LOC {DESCRIPTION} интерпретируется как адрес другого скаляра, который считывается в $comment.

В Perl,

my $str = 'some val';
my $ref = \$str;
my $val = ${$ref};
my $same_val = $$ref;