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

Кудрявые скобки, окружающие переменную

У меня есть этот фрагмент кода, который я пытаюсь развернуть, я даже не знаю, является ли его синтаксически правильным (часть упражнения, я думаю!)

%{$records}

Что означают фигурные скобки? Я видел один и тот же случай, но с оператором @, используемым вместо $, если это имеет значение.

Спасибо, ребята!

4b9b3361

Ответ 1

В разделе "Использование ссылок" документации perlref объясняется.

2. В любом месте, где вы указываете идентификатор (или цепочку идентификаторов) как часть имени переменной или подпрограммы, вы можете заменить идентификатор блоком, возвращающим ссылку правильного типа. Другими словами, предыдущие примеры можно было бы написать следующим образом:

   $bar = ${$scalarref};
   push(@{$arrayref}, $filename);
   ${$arrayref}[0] = "January";
   ${$hashref}{"KEY"} = "VALUE";
   &{$coderef}(1,2,3);
   $globref->print("output\n"); # iff IO::Handle is loaded

В вашем случае $records должен быть ссылкой на хэш (из-за внешнего %), {$records} - это блок, возвращающий ссылку, а %{$records} - исходный хэш.

Кудрявые скобки окружают добросовестный блок. Фактически, вы можете заменить код выше на

%{ if ($records) { $records } else { $default_records } }

Но даже более короткая версия вашего вопроса может быть упрощена, как указано ранее в документации.

1. В любом месте, где вы указываете идентификатор (или цепочку идентификаторов) как часть имени переменной или подпрограммы, вы можете заменить идентификатор простой скалярной переменной, содержащей ссылку правильного типа:

   $bar = $$scalarref;
   push(@$arrayref, $filename);
   $$arrayref[0] = "January";
   $$hashref{"KEY"} = "VALUE";
   &$coderef(1,2,3);
   print $globref "output\n";

Поскольку $records является простым скаляром, %$records является основным хешем.

Если вместо $records была ссылка на массив, синтаксис разыменования был бы @$records или @{$records}.

Ответ 2

Как и многие оболочки Unix, Perl позволяет использовать фигурные скобки для разграничения идентификаторов переменных, поэтому my ${scalar} совпадает с my $scalar. Это полезно, например, при взаимном использовании значения переменной в строке, когда "$scalartext" будет искать переменную с идентификатором scalartext, когда предполагается, что $scalar.'text'. Вместо этого вы можете написать "${scalar}text", чтобы получить правильный результат.

Perl примет либо пустой идентификатор переменной, либо выражение, возвращающее ссылку на переменную в фигурных скобках, поэтому %{$hashref} совпадает с %$hashref. Обратите внимание, что строка неприемлема, поскольку она рассматривается как символическая ссылка, которая является ошибкой в ​​strict 'refs', поэтому ${'scalar'} здесь не так.

В вашем случае %{$records} идентичен %$records, а некоторые предпочитают его, потому что он делает разыменование явно. Он представляет хеш, к которому относится хеш-ссылка $records.

Ответ 3

Вот как вы разыскиваете ссылку.

См. perldoc perlref.

Как обычно, % или @ указывает, какие данные вы хотите ( "Хэш" или "Массив" ).

За этим следует блок {}, который возвращает ссылку на соответствующий тип данных.

Итак: %{$records} принимает скаляр ($records), содержащий ссылку на хэш, и возвращает вам хэш.