Perl Ha sh Ссылки - Можно ли поместить ссылку на вложенный ha sh в 1 переменную? - PullRequest
3 голосов
/ 11 июля 2020

У меня есть частично вложенный ha sh вроде следующего:

$href = {one=>1, word_counts=>{"the"=>34, "train"=>4} };

, и я хотел бы получить значение $href->{'word_counts'}{'train'}. Можно ли поместить {'word_counts'}{'train'} в переменную, чтобы я мог получить к ней доступ, просто позвонив $href->$variable?

Ответы [ 3 ]

6 голосов
/ 11 июля 2020

Нет, но вы можете использовать Data :: Diver для получения значения из списка ключей:

my @keys = ('word_counts', 'train');
my $value = Data::Diver::Dive($href, \(@keys));
3 голосов
/ 11 июля 2020

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

Вы можете взять ссылку на значение, но тогда вам придется разыменовать его:

my $value_ref = \ $href->{'word_counts'}{'train'};
say $$value_ref;

Есть экспериментальная refaliasing функция , где обе стороны являются ссылочными. Теперь разыменование не требуется:

use v5.22;
\ my $value_ref = \ $href->{'word_counts'}{'train'};
say $value_ref; # 4
$value_ref = 17;
say $href->{'word_counts'}{'train'};  # 17

Самостоятельно пройти ха sh несложно. Уловка состоит в том, чтобы получить один уровень ha sh, сохранить его в переменной, а затем использовать эту переменную для перехода на следующий уровень. Продолжайте идти, пока не окажетесь там, где хотите:

my $href = {
    one => 1,
    word_counts => {
        "the" => {
            "dog" => 45,
            "cat" => 24,
            },
        "train" => {
            "car" => 7,
            "wreck" => 37,
            }
        }
    };

my @keys = qw( word_counts train car );

my $temp = $href;
foreach my $key ( @keys ) {
    die "Not a hash ref at <$key>" unless ref $temp eq ref {};
    die "<$key> not in the hash" unless exists $temp->{$key};
    $temp = $temp->{$key};
    }

print "Value is <$temp>";  # 7
1 голос
/ 13 июля 2020

В дополнение к более общим, отличным ответам ysth и brian d foy рассмотрите также очень простое (возможно, слишком простое) решение:

my @keys = qw( word_counts train);
print $href->{ $keys[0] }{ $keys[1] }; # 4

Обратите внимание, что это решение является повторяющимся, а не элегантным ( порядок ключей жестко запрограммирован) и не пытается пройти ха sh. Но в зависимости от контекста и конкретной задачи c OP, это может быть все, что нужно.

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