Есть ли лучший способ ссылаться на хэш? - PullRequest
1 голос
/ 01 октября 2019

Если у меня глубокая многоуровневая (динамическая) хеш-структура, я пытаюсь ссылаться на более глубокие части через отдельные переменные, что-то вроде этого:

my $multilevel_dynamic_hash;
my $dynamic_a = int( rand() * 100 );
my $dynamic_b = int( rand() * 100 );
my $dynamic_c = int( rand() * 100 );

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

call_to_some_subroutine( $reference_as_hashref );

Теперь вместо этих двух строк

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

есть ли возможность избежать первой строки и объявить $reference_as_hashref, чтобы она трактовала последнюю часть ($dynamic_c) как ключ к следующему уровню хэша?

EDIT

Я бы хотел взять ссылку, что-то вроде этого:

my $reference_as_hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c }{};

Внимание! last {}

Вместо этого сначала я должен сказать, что значением является hashref, а затем я могу сослаться на него. Возможно ли это за один шаг?

1 Ответ

4 голосов
/ 01 октября 2019

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

Например,

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

и

my $hashref = {};
$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = $hashref;

дает тот же результат.

Однако, есть еще более простое решение.

$multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};
my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c };

также можно записать как

my $hashref = $multilevel_dynamic_hash->{ $dynamic_a }{ $dynamic_b }{ $dynamic_c } = {};

Скалярное присваивание ассоциативно справа, поэтому $a = $b = $c; эквивалентно $a = ( $b = $c );. Возвращает свою левую часть, поэтому $a = ( $b = $c ) эквивалентно $b = $c; $a = $b;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...