Consider using
XML::Twig, which can parse large files without consuming a lot of memory:
#!/usr/bin/perl
use warnings;
use strict;
use XML::Twig;
use feature 'say';
my $parser = XML::Twig::->new(
twig_handlers => {
'/pathway/reaction[@name=~/^rn:/]' => \&handle,
# use XPath to describe what you want to handle
}
);
$parser->parsefile("myfile");
sub handle {
my($twig, $elt) = @_;
# handlers are given an XML::Twig object and an XML::Twig::Elt
+ object
say $elt->att("name");
say " substrate[s]: ", map { $_->att("id")." " } $elt->children("s
+ubstrate");
say " product[s]: ", map { $_->att("id")." " } $elt->children("pro
+duct");
}
Sorry if my advice was wrong.