PDA

Visualizza la versione completa : [PERL] Parsing semplice di un file XML


basileus
23-12-2010, 11:47
ciao a tutti
ho un piccolo problemino da risolvere

mi sono spulciato la classe XML::Simple coi relativi metodi

allora, dopo aver fatto il parser, ho una struttura simile per esempio a questa



{
'logdir' => '/var/log/foo/',
'debugfile' => '/tmp/foo.debug',
'server' => {
'sahara' => {
'osversion' => '2.6',
'osname' => 'solaris',
'address' => [ '10.0.0.101', '10.0.1.101' ]
},
'sahara' => {
'osversion' => '6.5',
'osname' => 'irix',
'address' => '10.0.0.102'
},
'sahara' => {
'osversion' => '2.0.34',
'osname' => 'linux',
'address' => [ '10.0.0.103', '10.0.1.103' ]
}
}
}


il problema è questo

come faccio ad accedere agli elementi che hanno lo stesso nome "sahara", dal momento che sono sullo stesso livello???

mi da erorre!!!

di solito faccio così:

$var1->{server}->{sahara}->{osversion};

grazie per l'aiuto

basileus
23-12-2010, 18:43
l'ho risolto così



$var1->{server}->[0]->{sahara}->{osversion};
$var1->{server}->[1]->{sahara}->{osversion};
$var1->{server}->[2]->{sahara}->{osversion};


ora nasce però un problema

se ne ho tante dovrei fare un for

come faccio a sapere quanti $var1->{server}->{sahara} ho?

ho provato con:


scalar($var1->{server}->{sahara})


ma non funziona

qualche idea??

basileus
24-12-2010, 07:55
risolto pure questo

basileus
25-12-2010, 10:13
questo è un problema che veramente non risco a risolvere


'logdir' => '/var/log/foo/',
'debugfile' => '/tmp/foo.debug',
'server' => {
'sahara' => {
'osversion' => '2.6',
'osname' => 'solaris',
'address' => [ '10.0.0.101', '10.0.1.101' ]
},
'sahara' => {
'osversion' => '6.5',
'osname' => 'irix',
'address' => '10.0.0.102'
},
'sahara' => {
'osversion' => '2.0.34',
'osname' => 'linux',
'address' => [ '10.0.0.103', '10.0.1.103' ]
}
}
}



'logdir' => '/var/log/foo/',
'debugfile' => '/tmp/foo.debug',
'server' => {
'sahara' => {
'osversion' => '2.6',
'osname' => 'solaris',
'address' => [ '10.0.0.101', '10.0.1.101' ]
}
}
}



il problema è questo

ci possono essere casi in cui "sahara" è un array oppure solo una variabile
ho bisogno di sapere coem valutare la cosa

come posso dire ad un elemento, ossia $var1->{logdir}->{server}->{sahara} , se è un array fai questo, altrimenti fai quest'altro


if ($var1->{logdir}->{server}->{sahara} ???? ) {
fai questo
} else {
fai quest'altro
}


il problema è come far comparare se l'elemnto che ho è un array oppure no

Mich_
27-12-2010, 09:12
vedi se riesci a risolvere con la funzione scalar

saintex
27-12-2010, 22:08
if ($var1->{logdir}->{server}->{sahara} ???? ) {
fai questo
} else {
fai quest'altro
}


ciao,
io farei una cosa molto semplice,
cioe' se è definito lo scalare,
mi creerei un array con il valore dello scalare,
così ti riconduci sempre alla variabile dell'array.

cioè:




use strict;
use warnings;
my $var='ciao';
my @var=($var) if (defined $var);
for (@var)
print $_."\n";
}

basileus
18-01-2011, 09:27
grazie

ho risolto in altro modo poi

mi sono creato una subroutine che verifica se il riferimento passatogli, è un array oppure no

Loading