Де-ссылка x количество раз для x количество структур данных

Я столкнулся с препятствием в одном из моих сценариев perl, которые мне удалось решить, но я не понимаю, почему он работает так, как он работает. Я прочесываю интернет, но я не нашел правильного объяснения.

У меня есть подпрограмма, которая возвращает ссылку на хэш массивов. Хеш-ключи - это простые строки, а значения - ссылки на массивы.

Я печатаю элементы массива, связанные с каждым ключом, например

for my $job_name (keys %$build_numbers) {
    print "$job_name => ";
    my @array = @{@$build_numbers{$job_name}};  # line 3
    for my $item ( @array ) {
        print "$item \n";
    } 
}

Хотя я могу распечатать ключи и значения, я действительно не понимаю синтаксиса за строкой 3.

Наша структура данных выглядит следующим образом:

Ссылка на хэш, значения которого являются ссылками на заполненные массивы.

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

Последний вопрос:

  • При работе с perl-хэшем хэшей массивов и т. Д.; чтобы извлечь элементы в "дне" дерева данных соответствующей структуры данных, мы должны поочередно разыскивать каждый уровень, чтобы достичь исходных структур данных, пока мы не получим желаемый уровень элементов?

Надеюсь, кто-то может помочь, уточнив.

0
источник поделиться
2 ответа

Строка 3 берет фрагмент вашей хэш-ссылки, но это очень странный способ сделать то, что вы пытаетесь сделать, потому что: a) вы обычно не срезаете один элемент и b) там более чистый и более очевидный синтаксис, который ваш код легче читать.

Если ваши данные выглядят примерно так:

my $data = {
    foo => [0 .. 9],
    bar => ['A' .. 'F'],
};

Тогда правильная версия вашего примера будет:

for my $key (keys(%$data)) {
    print "$key => ";

    for my $val (@{$data->{$key}}) {
        print "$val ";
    }

    print "\n";
}

Что производит:

bar => A B C D E F
foo => 0 1 2 3 4 5 6 7 8 9

Если я понимаю ваш второй вопрос, ответ заключается в том, что вы можете получить доступ к точным местоположениям сложных структур данных, если используете правильный синтаксис. Например:

print "$data->{bar}->[4]\n";

Будет напечатан E

Дополнительное рекомендуемое чтение: perlref, perlreftut и perldsc

+4
источник

Работа с структурами данных может быть сложной в зависимости от того, как она была создана.

Я не уверен, что ваша структура данных "работа" точно такая, но:

#!/usr/bin/env perl

use strict;
use warnings;
use diagnostics;


my $hash_ref = {

 job_one => [ 'one', 'two'],
 job_two => [ '1','2'],

};

foreach my $job ( keys %{$hash_ref} ){

 print " Job => $job\n";

 my @array = @{$hash_ref->{$job}};

 foreach my $item ( @array )
 {

        print "Job: $job Item $item\n";
 }

}

У вас есть хеш-ссылка, в которой вы повторяете ключи, которые являются массивами. Но каждый элемент этого массива может быть другой ссылкой или простым скаляром.

В основном вы можете работать с ref или отменять ref, как в первом цикле.

Существует часть документации вы можете проверить более подробную информацию здесь.

Поэтому, отвечая на ваш вопрос:

Заключительный вопрос: - при работе с хэшами perl хэшей массивов и т. Д.; чтобы извлечь элементы в "дне" дерева данных соответствующей структуры данных, мы должны поочередно разыскивать каждый уровень, чтобы достичь исходных структур данных, пока мы не получим желаемый уровень элементов?

Это зависит от того, как была создана ваша структура данных, и если вы уже знаете, что вы ищете, было бы просто получить значение, например:

% city_codes = (

a => 1, b => 2,

);

my $ value = $ city_codes {a};

Комплексные структуры данных имеют сложный код.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос