2012-08-23 1 views
0

Hy, 디렉토리 및 모든 하위 디렉토리에있는 모든 파일을 연관 배열에 쓰고이 레이에서 XML을 만들고 싶습니다. 여기 내 코드가있다.Perl XML :: Simple write 디렉토리

$VAR1 = { 
      './out.log' => { 
          'size' => 51, 
          'time' => 1345720984 
         }, 
      './foo/bat.txt' => { 
           'size' => 24, 
           'time' => 1345708287 
          }, 
      './test.pl' => { 
          'size' => 438, 
          'time' => 1345720762 
         } 
     }; 
<opt> 
    <./out.log size="51" time="1345720984" /> 
    <./foo/bat.txt size="24" time="1345708287" /> 
    <./test.pl size="438" time="1345720762" /> 
</opt> 

배열이 괜찮습니다하지만 같은 XML이 보일 것입니다 :

<file name="bla.txt"> 
    <time>"1234"</time> 
    <size>"1234"</size> 
</file> 

저를 도와주세요

use strict; 
use warnings; 

use File::Find; 
use Data::Dumper; 
use XML::Simple; 

my $base_dir = '.'; 

my $xs = new XML::Simple; 
my %filelist; 

find(\&print_name_if_dir, $base_dir); 

sub print_name_if_dir 
{ 
    if (-f $_) { 
     $filelist{$File::Find::name}{size}=-s $_; 
     $filelist{$File::Find::name}{time}=(stat $_)[9]; 
    } 
} 

print Dumper(\%filelist); 
my $xml = $xs->XMLout(\%filelist, keyattr => "filename"); 
print $xml; 

는이 내 출력됩니다.

답변

1

XML::Simple은 꽤 간단합니다. 그것의 문서는 심지어 그렇게 말한다. 당신은 생각할 수있는 모든 출력 형식을 얻을 수 없으며, 당신의 가능성은 거의 없다.

그러나 현재의 위치보다 가까이에 위치 할 수 있습니다. 이 저장 구조 :

my $files = { 
    file => [ 
    { name => 'chunky.txt', time => 12345, size => 321 }, 
    { name => 'bacon.dat', time => 47123, size => 222 }, 
    ], 
}; 

이 (print XMLout($files)를 통해) 다음과 같은 출력 될 것입니다 :

내 의견으로는, 불가능 무엇
<opt> 
    <file name="chunky.txt" size="321" time="12345" /> 
    <file name="bacon.dat" size="222" time="47123" /> 
</opt> 

, 대신의 자녀로 출력 할 timesize 강요 속성.

오, 이러한 구조는 쉽게 다음 코드를 사용하여 구축 할 수 있습니다 :

my %filelist = (file => []); 

sub print_name_if_dir { 
    return unless -f; 

    push @{ $filelist{file} }, { 
    name => $_, 
    size => -s $_, 
    time => (stat $_)[9], 
    }; 
} 
+0

대단히 감사합니다! 루프없이이 배열에서 특정 파일 이름을 검색하고 속성에 액세스 할 수있는 방법을 알고 있습니까? – AndyH

+0

루프가 없습니까? 'print_name_if_dir'에서 생성 된 해시 참조를 파일 이름별로 두 번째 해시에 저장할 수도 있습니다 ('% filerefs'라고 부르 자). 이것을'print_name_if_dir'의 마지막 줄에 추가하십시오 :'$ filerefs {$ _} = $ filelist {file} -> [- 1];' –

+0

Nice! 모리츠 고맙습니다. – AndyH