Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: XML::Twig newbie question

by Anonymous Monk
on Sep 18, 2012 at 02:19 UTC ( #994170=note: print w/ replies, xml ) Need Help??


in reply to XML::Twig newbie question

What I can't figure out is, how to pass the name in $file to the event handler, or conversely, how to associate the found attribute back to the $file. I'm probably missing something obvious, but can't puzzle it out. Any suggestions would be greatly appreciated.

You're missing closures, examples in XML::Twig traversing tree and storing in an array, XML::Twig n00b, Tutorials: Closure on Closures

for my $file ( ... ){ my $filename = $file; my %filnameKeyref; my $topicref = sub { ... $filenameKeyref{ $filename }; return; }; my $twig= XML::Twig->new( ... => $topicref ); $twig->...; }

Although you ought to write that as

for my $file ( ... ){ my $complexAssociations = FooAssoc( $file ); WalkAndTalk( $complexAssociations ); }


Comment on Re: XML::Twig newbie question
Select or Download Code
Re^2: XML::Twig newbie question
by Jenda (Abbot) on Sep 18, 2012 at 07:15 UTC

    Another way would be to make the subroutine curried (that is expecting to get the parameters separately, not all at once):

    foreach my $file (@files){ # set up the XML parser: my $twig= XML::Twig->new( twig_handlers => { topicref => topicref_processing($file), xref => topicref_processing($file) }, ); $twig->parsefile($file); $twig->purge; } sub topicref_processing { my ($file) = @_; return sub { my($twig, $topicref) = @_; my($atts) = $topicref->atts(); if($$atts{'keyref'}){ ### associate this keyref with $file } } }

    Jenda
    Enoch was right!
    Enjoy the last years of Rome.

      Another way would be to make the subroutine curried (that is expecting to get the parameters separately, not all at once):

      Sure, you could write your closure that way ( the schönfinkeling way), but it gains you nothing in this example, it just takes a little more memory

        Depends on the complexity of the subroutine. Maybe you do not want to include all that code in the middle of the loop. I would not sweat over the tiny difference in memory footprint or the cost of two additional subroutine calls. Use whatever makes the code easier to maintain.

        Jenda
        Enoch was right!
        Enjoy the last years of Rome.

      "Curried?" sounds delicious! :-) Never heard that phrase before.

      Thank you, this is a simple solution that works perfectly for me.

      Scott

Re^2: XML::Twig newbie question
by slugger415 (Beadle) on Sep 18, 2012 at 15:52 UTC

    Thank you for the suggestions; I will study the examples and try to understand them. A bit over my head at first sight.

    Scott

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://994170]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (8)
As of 2014-08-30 08:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (291 votes), past polls