Perl $$ var - два знака доллара в качестве сигилы?
Это похоже на то, что я должен быть в состоянии легко Google, Bing или DDG, но я полностью опустел на все.
В принципе, мне поручено (частично) переписать набор старых скриптов Perl. Не будучи самим программистом Perl, определенно есть кривая обучения при чтении этих сценариев, чтобы выяснить, что они делают, но я ударил абсолютную кирпичную стену с такими линиями, как этот:
$comment = $$LOC{'DESCRIPTION'};
Рядом, как я могу судить, правая часть - это словарь, или, точнее, получение значения, на которое ссылается ключ 'DESCRIPTION'
в указанном словаре. Но что с "лишним" знаком доллара перед ним?
Он выглядит подозрительно, как PHP переменные переменные, но после очистки поисковых систем, сортированных сайтов StackExchange и perlvar Я не могу найти никаких указаний на то, что Perl даже имеет такую функцию, не говоря уже о том, что так оно и происходит. Самое большее, что я обнаружил, это то, что "$" не является допустимым символом в имени переменной, поэтому я знаю, что $$LOC
- это не просто вызов переменной, которая просто называется $LOC
.
Что это за дополнительный знак доллара здесь?
Ответы
Ответ 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;