Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??

In order to pass arguments to a handler you need to use a closure:

parse_xml( $xmlfile); sub parse_xml { my( $file)= @_; my $ups_able_info= []; my $twig1 = XML::Twig->new( twig_handlers => { 'ups:TABLE_INFO/ups:field' => sub { parse +_table_info( @_, $ups_able_info); } ) ->parsefile( $file); # now $ups_table_info is filled } sub parse_table_info { my( $twig, $table_info, $ups_able_info)= @_; # note the extra argu +ment my $table_column = {}; $table_column->{$table_info->field('ups:tag')} = $table_info->fie +ld('ups:ui_name'); push(@{$ups_table_info}, $table_column); }

A good introduction to closures in Perl: Achieving closure by Simon Cozens

Also, I made a few cosmetic changes to your code, mostly to make it look a bit more modern:

  • no need for the & before a function name,
  • you mix camel case (parseXml) and underscore separated (parse_table_info) names, pick one scheme and stick to it (also, I hate camelCase ;--)
  • to me my $ups_able_info= []; is a lot more readable than my( $ups_able_info)= ([]);
  • use the XML::Twig->new syntax instead of the old, and potentially dangerous, new XML::Twig
  • I added the call to parsefile, to actually parse the file,
  • I usually write $elt->field( 'foo') instead of the longer $elt->first_child_text( 'foo') (even if it takes me longer to type because I usually type filed first, then go back and fix it ;--(

Also, you data structure seems a bit weird to me, but maybe it makes sense, I don't have enough detail to tell. $ups_table_info will end up looking something like [ { ui_tag => "val" }, {ui_another_tag => "val2"}, ...],, which doesn't look like the easiest to use data.


In reply to Re: Passing parameters for XML::twig handler by mirod
in thread Passing parameters for XML::twig handler by shree

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others studying the Monastery: (15)
    As of 2015-07-02 19:19 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 (44 votes), past polls