[Roma.pm] xml + tag name

Flavio Poletti flavio at polettix.it
Mon Jul 23 04:16:56 PDT 2007


Uhm, non sono così sicuro che HOP voglia dire ricorsione, e non-HOP voglia
dire iterazione.

Nonostante la ricorsione sia un tema centrale, viene comunque trattato il
tema della trasformazione di una soluzione ricorsiva in una iterativa con
il "metodo dell'agenda" (se non ricordo male), che sostanzialmente cerca
di implementare quelle parti dello stack che servono effettivamente all
ricorsione.

Mi sarebbe sembrata una soluzione molto più "HOP" se si fosse basata sugli
iteratori, ad esempio. Per questo la domanda :)

Ciao,

   Flavio.


> 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>
> _______________________________________________
> Roma mailing list
> Roma at pm.org
> http://mail.pm.org/mailman/listinfo/roma
>




More information about the Roma mailing list