Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

Passing additional arguments to XML::Twig handlers

by pseudomonas (Monk)
on Jan 29, 2008 at 14:25 UTC ( #664900=perlquestion: print w/replies, xml ) Need Help??
pseudomonas has asked for the wisdom of the Perl Monks concerning the following question:

Wise Monks: I'm using XML::Twig and its function handlers. These take coderefs, to which are passed (as @_) the values of the twig and the section being processed. However, if I want to pass the coderef other values as well, it doesn't seem to retrieve the twig and section as I'd expect. I'm a bit stumped, I can't seem to find this case in the documentation. Example:
#!/usr/bin/perl use XML::Twig; my $t=XML::Twig->new( twig_handlers => { name => \&my_s }); $t->parse('<doc><name>Alice</name><name>Bob</name></doc>'); sub my_s { my ($twig, $section, $greeting) = @_; print $greeting || "Hello" , ", ", $section->text(), "!\n"; } # Yields: # Hello, Alice! # Hello, Bob!
If I try
my $t=XML::Twig->new( twig_handlers => { name => \&my_s("Hi") }); # Can't call method "text" on an undefined value # likewise with &my_s->("Hi")
What am I missing?

Replies are listed 'Best First'.
Re: Passing additional arguments to XML::Twig handlers
by Fletch (Chancellor) on Jan 29, 2008 at 14:31 UTC

    Use an anonymous coderef (which adds the extra arguments) to set the handler.

    my $t = XML::Twig->new( twig_handlers => { name => sub { my_s( @_, "Hi +" ) } } );

    The cake is a lie.
    The cake is a lie.
    The cake is a lie.

      Thanks! This seems to work fine.
Re: Passing additional arguments to XML::Twig handlers
by mirod (Canon) on Jan 29, 2008 at 14:43 UTC

    The best explanation I have seen about closures and how to use them in XML::Twig is Simon Cozens' Achieving Closure.

Re: Passing additional arguments to XML::Twig handlers
by moritz (Cardinal) on Jan 29, 2008 at 14:33 UTC
    If you want only constant args, you can fall back on closures:
    my $greeting = "hi"; my $my_s = sub { my ($twig, $section) = @_; print $greeting || "Hello" , ", ", $section->text(), "!\n"; }

    You can then pass the closure in $my_s just like a normal reference to a sub.

      The args change from parse to parse, unfortunately. Closures are something I need to get more used to in general, though - thanks!

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://664900]
Approved by moritz
[1nickt]: ugh, I stuck my head in the bass bin for 30 seconds on a dare at Ted Nugent at Hammersmith Odeon. Yes, I am 40% deaf now.
[johngg]: My daughter is incredibly jealous of my wife who got to see The Clash at Brixton many years ago. They went to see The Vaccines there recently.
[1nickt]: But the bands are even louder! I saw Spearhead (Michael Franti) at an outdoor show and had to walk a mile away to not feel pain in my chest! Babies were crying ... I asked the sound engineer why it was necessary to have the bass so loud and he laughed...
[Discipulus]: but the best i attended live was Mano Negra Patchanka at Forte Prenestino .. in 1990
[Corion]: Hmmm - Mano Negra or at least Manu Chao seem to put on a good live show. At least the one live CD I have from Manu Chao sounds good ;)
Discipulus feels the same jealousity of the johngg's daughter
[1nickt]: choroba I agree
[choroba]: Playing in a punk rock band for 20 years... my hearing is quite bad
[Corion]: I still have hopes to turn my godson and his two siblings into a punk band ;)

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (12)
As of 2017-03-24 12:19 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (301 votes). Check out past polls.