Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

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?

Comment on Passing additional arguments to XML::Twig handlers
Select or Download Code
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 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!
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.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (4)
As of 2015-07-04 03:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls