Причина, по которой он печатает HASH(0x18948c4)
, заключается в том, что содержимое этого значения на самом деле не пустое, а хэш-ссылка.Когда вы печатаете что-то, Perl пытается это что-то упорядочить, и результат строковой ссылки на хеш-строку - HASH(address)
, где address - это адрес фактического хеш-значения.
Распечатайте фактическое содержимое этого хеш-значения следующим образом:
use Data::Dumper;
print Data::Dumper->Dump([$detail->{Parsing}->{Through}->{XML}->{ElementContents}]);
Если, как вы говорите, «нет содержимого», это, вероятно, будет пустой хэш-код:
$VAR1 = {};
Если это так, вы можете проверить его с помощью:
if (ref($detail->{Parsing}->{Through}->{XML}->{ElementContents}) eq ref({})
&& !keys %{ $detail->{Parsing}->{Through}->{XML}->{ElementContents} })
print "No contents, empty hashref";
}
Первое условие гарантирует, что это хэш-ссылка, во-вторых, что хеш, полученный в результате его разыменования, имеет нулевые элементы в качестве ключей - это означает, что на пустой хеш ссылаются.
Однако я серьезно сомневаюсьэто пустой хэш из того, что я вспомнил о XML :: Simple - и выполнение печати Data :: Dumper, как показано выше, покажет вам, как с этим бороться.Вы всегда должны распечатывать неизвестные структуры данных таким образом, чтобы выяснить, что с ними делать.
Например, если ваш вывод Data :: Dumper был:
$VAR1 = {
'a' => 1
};
Тогда вам нужно распечатать$detail->{Parsing}->{Through}->{XML}->{ElementContents}->{a}
, очевидно.Опять же, будьте осторожны, чтобы печатать только то, что является скаляром, а не массивом или хеш-ссылкой, поэтому идите вниз по структуре данных столько, сколько необходимо, чтобы добраться до скаляра.