Получение значений из сложных хэш-структур Perl

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

use Data::Dumper;
my $fdx = $s->field();   # get Hashreference from Database
print Dumper($fdx);      # print out Hash

Вывод (важная часть) выглядит следующим образом:

$VAR1 = bless( {
     'selectable' => 'true',
     '_PARENT_OBJECT' => bless( {
           'dirtyFlag' => 1,
           'path' => undef,
           'testItems' => [],
           'data' => {
                'TEST_10' => {
                     'atm_rundatahistory' => {
                           '1523964918' => {
                                'atm_prid' => {
                                      'content' => '',
                                      'label' => 'Problem Report IDs',
                                      'raw' => ''
                                 }, ...
                            '1523964410' => {
                                 'atm_prid' => {
                                       'label' => 'Problem Report IDs',
                                       'raw' => '23361234',
                                       'content' => '23361234'
                                  }, ...

"Test_10" - один из сотен тестов, '1523964918' - одна из многих временных меток unix, поэтому в основном это 32-битное целое число, но я не знаю, какие числа содержат временные метки.

Как мне распечатать / получить доступ к значениям 'содержание' (в данном случае «23361234») самых внутренних хэшей для всех тестов и временных меток unix, если они существуют?


с этого момента я опишу свои мысли и то, что я пробовал, нет необходимости читать дальше по этому вопросу.

Я думаю, что код, который я ищу, выглядит примерно так:

foreach my $val($fdx{_PARENT_OBJECT}{data}{"TEST_*"}{atm_rundatahistory}{"********"}{atm_prid}{content}) 
    print("\n$val");

Однако я не знаю точного синтаксиса, и я также не знаю, какие заполнители установить для "Test_10", поскольку существует много номеров тестов, например "...Test_132...Test_134" и временные метки Unix могут быть любыми 32-битными целыми числами, так что я думаю, я могу использовать start в качестве заполнителя? например "********".

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

Я уже читал perldoc_perlreftut. Если есть какой-либо другой простой для понимания учебник для решения подобных проблем, порекомендуйте его мне. Я действительно не знаю, как мне самому научиться обрабатывать такие сложные структуры данных в Perl.

Ваш $fdx содержит объект, который, в свою очередь, содержит другие объекты, но вы отключили имена классов. Похоже, вы используете проприетарный код для получения данных из своей базы данных, поэтому мы не можем сказать вам, как это сделать, используя встроенные механизмы вашего кода. Однако вам не следует копаться во внутреннем устройстве объекта, поскольку способ реализации объектов в Perl позволяет им изменять, и нет никакой гарантии, что ваш код не сломается внезапно, если вы возьмете внутренние компоненты. Вместо этого установите Data :: Printer и используйте его для проверки объекта. use Data::Printer class => { expand => 'all' }; p $fdx ...

simbabque 24.10.2018 13:04

... затем вы можете проверить, какие методы доступны, есть ли способ перебора или поиска данных и т. д. Если это проприетарный код вашей организации, вам следует прочитать фактический код классов, и, надеюсь, он будет содержать документацию. Если это действительно открытый исходный код, вы должны сделать то же самое.

simbabque 24.10.2018 13:05

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

CaptainCovfefe 24.10.2018 13:07

да. bless - это ключевое слово, которое объединяет структуру данных с пакетом, превращая его в объект. Мы свободно используем слово класс в Perl для пакетов с объектно-ориентированным интерфейсом. Вы можете определить методы (которые являются просто подпрограммами) по их первому аргументу $self, который является соглашением об именах для самого объекта. Вызов $foo->frobnicate($bar) будет выглядеть как package Foo; sub frobnicate { my ( $self, $bar ) = @_; ... } 1;. Оператор со стрелкой -> берет пакет, в который благословлена ​​вещь слева, чтобы найти метод справа, и передает ему объект слева.

simbabque 24.10.2018 13:10

Обратите внимание, что вы действительно можете просто проникнуть в структуру данных. Для ключа не существует такой вещи, как заполнитель. Вам нужно повторять по всем ключам, используя цикл. Это довольно просто. Вам нужно будет использовать ключевое слово keys и хотя бы один цикл foreach. Но делать это с объектами - это действительно плохая практика, поскольку он может сломаться в любой момент, и его будет очень сложно поддерживать, поскольку вы создаете связь там, где ее не должно быть. Я не могу сказать вам, как это сделать правильно, поскольку я не знаю вашу систему, но я могу сказать вам, что вам нужно делать.

simbabque 24.10.2018 13:17

в настоящее время устанавливается Data :: Printer, так что в основном это было бы как 6 или 7 вложенных циклов foreach, каждый из которых идет на один шаг «глубже» в структуру хэша? спасибо за помощь, к сожалению, у меня еще нет репутации, чтобы проголосовать за: /

CaptainCovfefe 24.10.2018 13:21

после установки Data :: Printer use Data::Printer class => { expand => 'all' }; p $fdx; ничего не выводит. вроде работает, ошибок нет.

CaptainCovfefe 24.10.2018 13:26

На самом деле я не ответил, это просто комментарии. Голосование по ним не имеет никакого эффекта, кроме фильтрации для более поздних зрителей. Ваш выход p идет на STDERR. Если это в веб-приложении, это будет в журнале вашего сервера. Вместо этого используйте print np $foo для записи на STDOUT.

simbabque 24.10.2018 15:04

Вам не нужно 6 или 7 петель, если остальные клавиши зафиксированы. Они нужны вам только для динамических ключей. Из вашего описания похоже, что _PARENT_OBJECT, data и atm_rundatahistory являются фиксированными, как и значения внутри каждой временной метки.

simbabque 24.10.2018 15:08

Позвольте нам продолжить обсуждение в чате.

simbabque 24.10.2018 15:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
98
0

Другие вопросы по теме