Как преобразовать выходные данные Data :: Dumper обратно в структуру данных Perl? - PullRequest
1 голос
/ 17 июня 2009

Мне было интересно, не могли бы вы пролить свет на код, который я делал пару дней.

Я пытался преобразовать хеш-код, проанализированный с помощью Perl, обратно в XML с помощью методов XMLout () и XMLin (), и с этим форматом это было довольно успешно.

#!/usr/bin/perl -w
use strict;

# use module
use IO::File;
use XML::Simple;
use XML::Dumper;
use Data::Dumper;
my $dump = new XML::Dumper;

my ( $data, $VAR1 );

Topology:$VAR1 = {  
   'device' => {  
    'FOC1047Z2SZ' => {  
      'ChassisID' => '2009-09',  
      'Error' => undef,  
      'Group' => {  
        'ID' => 'A1',  
        'Type' => 'Base'  
      },  
      'Model' => 'CATALYST',  
      'Name' => 'CISCO-SW1',  
      'Neighbor' => {},  
      'ProbedIP' => 'TEST',  
      'isDerived' => 0  
    }  
  },  
  'issues' => [  
    'TEST'  
  ]  
};  

# create object  
my $xml = new XML::Simple (NoAttr=>1,  
                           RootName=>'data',     
                           SuppressEmpty => 'true');  

# convert Perl array ref into XML document  
$data = $xml->XMLout($VAR1);  

#reads an XML file  
my $X_out = $xml->XMLin($data);  

# access XML data  
print Dumper($data);  
print "STATUS: $X_out->{issues}\n";  
print "CHASSIS ID: $X_out->{device}{ChassisID}\n";  
print "GROUP ID: $X_out->{device}{Group}{ID}\n";  
print "DEVICE NAME: $X_out->{device}{Name}\n";  
print "DEVICE NAME: $X_out->{device}{name}\n";  
print "ERROR: $X_out->{device}{error}\n";  

Я могу получить доступ ко всем элементам в XML без проблем.

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

#!/usr/bin/perl -w
use strict;
#!/usr/bin/perl

# use module
use IO::File;  
use XML::Simple;  
use XML::Dumper;  
use Data::Dumper;  
my $dump = new XML::Dumper;  

my ( $data, $VAR1, $line_Holder );

#this is the file that contains the parsed hash  
my $saveOut = "C:/parsed_hash.txt";  
my $result_Holder = IO::File->new($saveOut, 'r');  
while ($line_Holder = $result_Holder->getline){  
    print $line_Holder;  
}  

# create object  
my $xml = new XML::Simple (NoAttr=>1, RootName=>'data', SuppressEmpty => 'true');  
# convert Perl array ref into XML document  
$data = $xml->XMLout($line_Holder);  
#reads an XML file  
my $X_out = $xml->XMLin($data);  

# access XML data  
print Dumper($data);  
print "STATUS: $X_out->{issues}\n";  
print "CHASSIS ID: $X_out->{device}{ChassisID}\n";  
print "GROUP ID: $X_out->{device}{Group}{ID}\n";  
print "DEVICE NAME: $X_out->{device}{Name}\n";  
print "DEVICE NAME: $X_out->{device}{name}\n";  
print "ERROR: $X_out->{device}{error}\n";  

У вас есть идеи, как я могу получить доступ к $ VAR1 внутри текстового файла?

С уважением,
newbee_me

Ответы [ 6 ]

5 голосов
/ 17 июня 2009
$data = $xml->XMLout($line_Holder); 

$ line_Holder содержит только последнюю строку вашего файла, не весь файл, и не хеш-адрес perl, который может возникнуть в результате проверки файла. Попробуйте что-то вроде этого:

my $ref = do $saveOut;

Функция do загружает и проверяет файл для вас. Вы можете сделать это в отдельных шагах, таких как:

use File::Slurp "read_file";
my $fileContents = read_file( $saveOut );
my $ref = eval( $fileContents );
4 голосов
/ 18 июня 2009

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

4 голосов
/ 17 июня 2009

В основном для загрузки данных Dumper, которые вы eval () это:

use strict;
use Data::Dumper;
my $x = {"a" => "b", "c"=>[1,2,3],};
my $q = Dumper($x);
$q =~ s{\A\$VAR\d+\s*=\s*}{};
my $w = eval $q;
print $w->{"a"}, "\n";

Регулярное выражение (s {\ A \ $ VAR \ d + \ s * = \ s *} {}) используется для удаления $ VAR1 = из начала строки.

С другой стороны - если вам нужен способ сохранить сложную структуру данных и загрузить ее снова, гораздо лучше использовать модуль Storable и его функции store () и retrieve ().

1 голос
/ 10 апреля 2010

Пожалуйста, используйте модуль дампа в качестве замены для Data :: Dumper

1 голос
/ 08 ноября 2009

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

 open(DATA,">",$file);
 print DATA Dumper(\%g_write_hash);
 close(DATA);

 my %g_read_hash = %{ do $file };
1 голос
/ 18 июня 2009

Имя переменной, используемой в выводе Data::Dumper, можно настроить с помощью $Data::Dumper::Varname.

Пример

use Data::Dumper
$Data::Dumper::Varname = "foo";
my $string = Dumper($object);
eval($string);

... создаст переменную $foo и должна содержать те же данные, что и $object. Если ваша структура данных сложна и у вас странные результаты, вы можете рассмотреть методы Storable freeze() и thaw().

...