2012-09-10 4 views
2

배열의 해시 해시가 포함 된 .dmp 파일을 구문 분석하려고합니다. MySQL 데이터베이스에 저장할 수 있도록 배열에서 키 값 쌍을 가져와야합니다. 몇 가지 방법을 시도했지만 제대로 작동하지 않습니다. 파일의배열 해시의 해시 구문 분석 Perl

코드는 다음과 같습니다 나는 데이터베이스

$VAR={ 'booktodo-yzi07mwp-1102021083' => { 
    '_modtime' => [ 
     1102021143 
    ], 
    'version' => [ 
     '25' 
    ], 
    'pubnum' => [ 
     '2332' 
    ], 
    '_status' => [ 
     'active' 
    ], 
    '_user' => [ 
     'lcm' 
    ], 
    'description' => [ 
     'Revise trademarks' 
    ] 
    }, 
    'booktodo-p8ekw9d3-1104950962' => { 
    '_modtime' => [ 
     1104950986 
    ], 
    'version' => [ 
     '3.0' 
    ], 
    'pubnum' => [ 
     'S-2326-30' 
    ], 
    '_status' => [ 
     'active' 
    ], 
    '_user' => [ 
     'malz' 
    ], 
    'description' => [ 
     'Send out a request for install guide changes' 
    ] 
    }, 

에 한 줄에 배열 한 해시를 저장해야 이것은 내가 지금까지있는 것입니다. 배열의 요소에 액세스하려고합니다. 고마워요!

#!/usr/bin/perl 

use DBI; 
use strict; 
use Data::Dumper; 
use File::Slurp; 
use lib "$ENV{HOME}/modules/lib"; 

my %VAR; 

#open DMP; 
open (FILE, "<./booktodo.dmp") or die "could not open file: $!"; 
undef $/; 


#store evaled data in %VAR hash 
%VAR = <FILE>; 
close(FILE); 
eval %VAR; 

foreach my $loop (keys %VAR){ 
    foreach my $hash (keys $VAR{$loop}){ 
     for my $i (0..$#{$VAR{$loop}}){ 
       print "$i= $VAR{$loop}[$i]\n"; 
     } 
    } 
} 
+4

변경 사항을 제안 할 수 있도록 시도한 코드를 보여주십시오. – stu42j

+2

코드에 몇 가지 문제가 있습니다. 첫째, **'use warnings' **! 둘째, 파일 내용을'% VAR '로 읽는 것입니다. 'warnings'을 사용하면 '홀수 개의 요소'경고가 나타납니다. 'undef $ \'때문에'% VAR'의 첫번째 키에 모든 것을 넣습니다. (당신의'File :: Slurp'은 어떨까요?). 'print Dumper \ % VAR'을 시도하면 무슨 뜻인지 알 수 있습니다. 어떻게 할 수 있는지 [@ user5402 's answer] (http://stackoverflow.com/a/12359677/1331451)를 참조하십시오. – simbabque

답변

2

방법에 대해 : 당신은 지금 해시에 대한 참조로 작업

... 
my $contents = <FILE>; 
close(FILE); 

my $hash_of_hashes_of_arrays = eval $contents; 
... 

참고. 이상을 반복하려면 다음을 수행하십시오.

for my $key (keys %$hash_of_hashes_of_arrays) { 
    my $hash = $hash_of_hashes_of_arrays->{$key}; 
    for my $key2 (keys %$hash) { 
    my $array = $hash->{$key2}; 
    for my $i (0..$#$array) { 
     print "$i: $$array[$i]\n"; 
    } 
    } 
} 
+0

감사합니다. 당신이 여기서 한 일을 이해하고 시도해 보도록하겠습니다. – Xtina

+0

약간의 설명은 좋을 것이므로 OP는 문제가있는 곳을 볼 수 있습니다. – simbabque

+1

문자열 ['eval'] (http://perldoc.perl.org/functions/eval.html)을 사용할 때의 보안 위험을 지적해야합니다. –