Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??

How do I communicate @HOGS from &view_handler to find_hidden_views_with_resortable_indexes( $db ) without having to use a global? I'm certain there is a normal XML::Twig facility or an idiomatic way to do this. Am I expected to pass in closures to XML::Twig->new? I think it'd be nice to share the same parser across the program instead of having to recreate it during the loop.

Updates Fixed a bug where @hogs was returned but @HOGS was tested. Also replaced @HOGS = () with local @HOGS.

use strict; use warnings; use vars qw(@HOGS $TWIG $DEFAULT_SERVER); use Notes::OLE (); use File::Basename (); use File::Temp (); use XML::Twig; use YAML (); $DEFAULT_SERVER = 'dev1'; exit main( @ARGV ); =pod <database> <view name='(...)'> <column resort='...'/> </view> </database> INTO server: filepath: view name: WHERE view name starts with ( and ends with ) and has a column with a resort attribute. =cut sub main { my $server = shift(@_) || $DEFAULT_SERVER; $TWIG = XML::Twig->new( twig_handlers => { q[view[@name =~ /^\(.+?\)$/]] => \&handle_view }, twig_roots => { view => 1, column => 1 } ); my %hogs; for my $dbp ( Notes::OLE::server_databases( $server ) ) { my $db = $Notes::OLE::S->GetDatabase( $dbp->{'server'}, $dbp->{'filepath'} ) or next; my @hogs = find_hidden_views_with_resortable_indexes( $db ); if ( @hogs ) { $hogs{ $dbp->{'server'} }{ $dbp->{'filepath'} } = [ @hogs ]; } } my $output = File::Basename::basename( $0 ); $output =~ s/\.[^.]+$/.yml/; YAML::DumpFile( $output, \%hogs ); my $editor = $ENV{'EDITOR'} || 'notepad'; system( $editor, $output ); return 1; } sub find_hidden_views_with_resortable_indexes { my $db = shift; # Input my $notes = $db->CreateNoteCollection( 0 ); $notes->{'SelectViews'} = 1; $notes->BuildCollection; # Output my $temp_file = File::Temp::tmpnam(); my $stream = $Notes::OLE::S->CreateStream; $stream->Open( $temp_file ); # Exporter my $exporter = $Notes::OLE::S->CreateDXLExporter( $notes, $stream +); $exporter->Process; # Cleanup so there are no open handles to the file $stream->Close; # Run XML::Twig on the exported schema local @HOGS; $TWIG->parsefile( $temp_file ); $TWIG->purge; # Remove the exported schema unlink $temp_file or warn "Couldn't delete $temp_file: $!"; return @HOGS; } sub handle_view { my ($t, $view) = @_; my $name = $view->att( 'name' ); push @HOGS, $name if $view->children( 'column[@resort]' ); return 1; }

janitored by ybiC: Balanced <readmore> tags around the codeblock, to reduce vertical scrolling on Monastery front page


In reply to Handler communication in XML::Twig by diotalevi

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



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2024-03-29 15:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found