С помощью следующего кода я могу извлечь данные, хранящиеся в хэше, из базы данных и распечатать их:
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.
... затем вы можете проверить, какие методы доступны, есть ли способ перебора или поиска данных и т. д. Если это проприетарный код вашей организации, вам следует прочитать фактический код классов, и, надеюсь, он будет содержать документацию. Если это действительно открытый исходный код, вы должны сделать то же самое.
эй, большое спасибо за ваш ответ, я попробую это сейчас. Значит, всякий раз, когда есть благословение на хеш, это какой-то класс и в конечном итоге имеет собственные методы? также я хочу только считывать данные, ничего не менять
да. bless
- это ключевое слово, которое объединяет структуру данных с пакетом, превращая его в объект. Мы свободно используем слово класс в Perl для пакетов с объектно-ориентированным интерфейсом. Вы можете определить методы (которые являются просто подпрограммами) по их первому аргументу $self
, который является соглашением об именах для самого объекта. Вызов $foo->frobnicate($bar)
будет выглядеть как package Foo; sub frobnicate { my ( $self, $bar ) = @_; ... } 1;
. Оператор со стрелкой ->
берет пакет, в который благословлена вещь слева, чтобы найти метод справа, и передает ему объект слева.
Обратите внимание, что вы действительно можете просто проникнуть в структуру данных. Для ключа не существует такой вещи, как заполнитель. Вам нужно повторять по всем ключам, используя цикл. Это довольно просто. Вам нужно будет использовать ключевое слово keys
и хотя бы один цикл foreach
. Но делать это с объектами - это действительно плохая практика, поскольку он может сломаться в любой момент, и его будет очень сложно поддерживать, поскольку вы создаете связь там, где ее не должно быть. Я не могу сказать вам, как это сделать правильно, поскольку я не знаю вашу систему, но я могу сказать вам, что вам нужно делать.
в настоящее время устанавливается Data :: Printer, так что в основном это было бы как 6 или 7 вложенных циклов foreach, каждый из которых идет на один шаг «глубже» в структуру хэша? спасибо за помощь, к сожалению, у меня еще нет репутации, чтобы проголосовать за: /
после установки Data :: Printer use Data::Printer class => { expand => 'all' }; p $fdx;
ничего не выводит. вроде работает, ошибок нет.
На самом деле я не ответил, это просто комментарии. Голосование по ним не имеет никакого эффекта, кроме фильтрации для более поздних зрителей. Ваш выход p
идет на STDERR
. Если это в веб-приложении, это будет в журнале вашего сервера. Вместо этого используйте print np $foo
для записи на STDOUT
.
Вам не нужно 6 или 7 петель, если остальные клавиши зафиксированы. Они нужны вам только для динамических ключей. Из вашего описания похоже, что _PARENT_OBJECT
, data
и atm_rundatahistory
являются фиксированными, как и значения внутри каждой временной метки.
Позвольте нам продолжить обсуждение в чате.
Ваш
$fdx
содержит объект, который, в свою очередь, содержит другие объекты, но вы отключили имена классов. Похоже, вы используете проприетарный код для получения данных из своей базы данных, поэтому мы не можем сказать вам, как это сделать, используя встроенные механизмы вашего кода. Однако вам не следует копаться во внутреннем устройстве объекта, поскольку способ реализации объектов в Perl позволяет им изменять, и нет никакой гарантии, что ваш код не сломается внезапно, если вы возьмете внутренние компоненты. Вместо этого установите Data :: Printer и используйте его для проверки объекта.use Data::Printer class => { expand => 'all' }; p $fdx
...