[Roma.pm] xml + tag name
Emanuele Zeppieri
ema_zep at libero.it
Mon Jul 23 03:48:45 PDT 2007
Flavio Poletti wrote:
> Uhm... perché? Non capisco quale sarebbe la non-HOP way, in questo caso.
Un'implementazione puramente iterativa(*).
Molto piu` inelegante dell'implementazione ricorsiva di Aldo, molto piu`
out nei salotti buoni (non solo quelli del Perl), ma anche molto piu`
efficiente, visto che Perl non ha la tail recursion optimization
(purtroppo :-(
(*)
Riporto la prima che mi viene in mente.
Sarebbe possibile anche una variante basata sul costrutto goto &func,
piu` compatta pero` meno efficiente.
use strict;
use warnings;
use XML::Simple;
my $data;
{ undef $/; $data = <DATA>; }
my $root = XMLin( $data, KeepRoot => 1 );
my @siblings;
push @siblings, [ 0, $root, [keys %$root] ];
while ( @siblings ) {
my ($level, $node, $remaining_tags) = @{ pop @siblings };
while ( my $tag = shift @{ $remaining_tags } ) {
print "\t" x $level, "$tag\n";
if ( ref( my $child = $node->{$tag} ) ) {
push @siblings, [ $level , $node , $remaining_tags ];
push @siblings, [ $level + 1, $child, [keys %$child] ];
last
}
}
}
__DATA__
<a>
<b>
<c />
<d />
</b>
<e />
<f>
<g />
<h />
</f>
</a>
More information about the Roma
mailing list