2011-10-05 16 views
0

我一直在測試XML::Simple與一些xml文件輸出,並已注意到如果我有一個以上的文件路徑,我的腳本將工作() 2.XML不是數組引用與perl XML ::簡單代碼

如果我只有(1)文件路徑(1.XML),那麼我會得到這個消息:Not an ARRAY reference at ./tst-simple.pl line 28

我的問題是,爲什麼不會對代碼的工作( 1)文件路徑?我正在使用ForceArray => 1。我該如何處理?

1.XML:

<?xml version="1.0" encoding="UTF-8"?> 
<listing time="2011-10-04T02:33:44+0000" recursive="no" path="/storage/foobar/test/queues/20110731" exclude="" filter=".*" version="0.20.202.1.1101050227"> 
    <directory path="/storage/foobar/test/queues/20110731" modified="2011-10-04T02:32:11+0000" accesstime="1970-01-01T00:00:00+0000" permission="drwx------" owner="unix_act" group="foobar"/> 
    <file path="/storage/foobar/test/queues/20110731/myfilename-00" modified="2011-10-03T04:47:46+0000" accesstime="2011-10-03T04:47:46+0000" size="123456789" app="3" blocksize="134217728" permission="-rw-------" owner="unix_act" group="foobar"/> 
</listing> 

2.XML:

<?xml version="1.0" encoding="UTF-8"?> 
<listing time="2011-10-04T02:33:44+0000" recursive="no" path="/storage/foobar/test/queues/20110731" exclude="" filter=".*" version="0.20.202.1.1101050227"> 
    <directory path="/storage/foobar/test/queues/20110731" modified="2011-10-04T02:32:11+0000" accesstime="1970-01-01T00:00:00+0000" permission="drwx------" owner="unix_act" group="foobar"/> 
    <file path="/storage/foobar/test/queues/20110731/myfilename-00" modified="2011-10-03T04:47:46+0000" accesstime="2011-10-03T04:47:46+0000" size="123456789" app="3" blocksize="134217728" permission="-rw-------" owner="unix_act" group="foobar"/> 
    <file path="/storage/foobar/test/queues/20110731/myfilename-01" modified="2011-10-03T04:47:46+0000" accesstime="2011-10-03T04:47:46+0000" size="123456789" app="3" blocksize="134217728" permission="-rw-------" owner="unix_act" group="foobar"/> 
</listing> 

代碼:

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper; 

my $xml = $ARGV [0]; 
my $data = XMLin($xml); 

for my $xs ($xml) { 
    #my $data = XMLin($xs, ForceArray => 0); 
    my $data = XMLin($xs, ForceArray => 1); 
    #my $data = XMLin($xs, ForceArray => [ qw (path) ]); 
    print Dumper ($data); 
} 

foreach my $file(@{ $data->{file} }) 
{ 
    my($dir, $fname); 
    if($file->{path} =~ /^(.*)\/([^\/]+)$/) 
    { 
     $dir = $1; 
     $fname = $2; 
    } 
    else 
    { 
     $dir = ""; 
     $fname = $file->{path}; 
    } 
    print "This is the DIRECTORY: $dir\n"; 
    print "This is the FILE:  $fname\n"; 
    print "This is the FILE SIZE: $file->{size}\n"; 
} 

回答

1

你有兩個不同的變量名爲$data。一個是使用ForceArray => 1創建的,但是您使用的是不使用ForceArray => 1而創建的那個。

更換

my $data = XMLin($xml); 

for my $xs ($xml) { 
    #my $data = XMLin($xs, ForceArray => 0); 
    my $data = XMLin($xs, ForceArray => 1); 
    #my $data = XMLin($xs, ForceArray => [ qw (path) ]); 
    print Dumper ($data); 
} 

my $data = XMLin($xml, ForceArray => 1); 
print(Dumper($data)); 
+0

感謝你的幫助。 – cjd143SD