2012-03-13 4 views
10

В Perl мне нужно проанализировать огромный хэш, поэтому я печатаю его в файл с помощью модуля Data::Dumper. Поскольку это огромный файл, его очень трудно прочитать. Возможно ли каким-то образом напечатать вывод Dumper, поэтому, когда я найду строку, которую я ищу, я смогу сразу увидеть ключевую структуру, где хранится строка, которую я ищу?Perl hash Data :: Dumper

В настоящее время я использую только простой код:

  use Data::Dumper; 
      ... 
      print Dumper $var; 

Что такое лучший синтаксис или альтернатива, чтобы получить хороший выход?

+2

Почему бы вам не привести пример вывода, который вы получаете, и выход, который вы хотите? Выход Dumper по умолчанию отформатирован, поэтому вы можете легко увидеть структуру клавиш, так что еще вы ищете? – TLP

+2

-1 Вы задаете неправильный вопрос. Свалка - огромный переплетенный объект. Вопрос должен состоять в том, что соответствующие вызовы API должны получить нужные вам данные, а не как [prettify dump] (http://p3rl.org/perltidy). – daxim

ответ

20

Я почти всегда устанавливается

$Data::Dumper::Indent = 1; 
$Data::Dumper::Sortkeys = 1; 

Data::Dumper с. Первый оператор делает вывод более компактным и более читаемым, когда структура данных имеет несколько уровней. Второе утверждение облегчает сканирование вывода и быстро найти ключи, которые наиболее заинтересованы.

Если структура данных содержит двоичные данные или встроенные вкладки/новую строку, также считает

$Data::Dumper::Useqq = 1; 

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

Значительно больше в perldoc.

+0

Да, это помогает немного, спасибо. –

+0

Извините, но я собираюсь спросить, что может быть вопросом новичков об этом ответе. Если действует строгая прагма, вам нужно сделать какое-то объявление в $ Data перед вышеуказанными утверждениями? –

+0

Нет, нет. '$ Data :: Dumper :: Indent' и' $ foo :: bar' являются «квалифицированными» именами переменных (они определяют пакет, а также имя переменной) и разрешены под 'strict'. – mob

-1

Это отвечает на вопрос.

my $WWW_Scripter_Plugin_JavaScript_JE = ${ $VAR1->[1]{156192192} }; 
my $JE_Object_String = ${ $WWW_Scripter_Plugin_JavaScript_JE->{pf}{String} }; 
my $JE_Object_Function = ${ $JE_Object_String->{props}{search} }; 
my $REF = ${ $JE_Object_Function->{global} }; 
my $HTML_DOM_Element_Img = $REF->{classes}{'HTML::DOM::Element::Img'}; 

Он также нарушает инкапсуляцию. Perl позволяет вам это делать, но лучше спросить, как получить данные с опубликованным API WWW :: Scripter.

+1

Раньше был комментарий, связанный с вопросом, указывающим на загрузку огромного дампа объекта WWW :: Scripter, этот комментарий был удален. Этот ответ является ответом на этот комментарий. – daxim

8

Одним из возможных решений является использование Data::Dumper::Perltidy, который запускает вывод Data :: Dump через Perltidy.

#!/usr/bin/perl -w 

use strict; 
use Data::Dumper::Perltidy; 

my $data = [{ title => 'This is a test header' },{ data_range => 
      [ 0, 0, 3, 9] },{ format  => 'bold' }]; 

print Dumper $data; 

__END__ 

Печать:

$VAR1 = [ 
    { 'title'  => 'This is a test header' }, 
    { 'data_range' => [ 0, 0, 3, 9 ] }, 
    { 'format'  => 'bold' } 
]; 

Другой способ заключается в использовании Data::Dump.

0
$Data::Dumper::Sortkeys = 1; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^