[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