kdmurphy001 has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks,

I need to call upon your help yet again. I have the following mediumtext field in a mysql database. Here's a typical pull.

BookUsageDetail: <BookReferences><BookUsage BookAbbr="dgpc01s" LinkedCount="1"/><BookUsage BookAbbr="gfac06s01" LinkedCount="3"/><BookUsage BookAbbr="gfca08s" LinkedCount="1"/><BookUsage BookAbbr="mcba06s" LinkedCount="2"/><BookUsage BookAbbr="kfei03s01" LinkedCount="2"/><BookUsage BookAbbr="hgia05s01" LinkedCount="1"/></BookReferences>

What I Need to do is get the stuff after BookAbbr into separate variables. I'd like to use a hash with the key being the stuff after BookAbbr and the value being what appears after LinkedCount so I'd have a hash that would look something like this:

hgia05s01 => 2, kfei03s01 => 2, and so on.

Still getting use to regex so any help is much appreciated! Thanks again guys.

  • Comment on Getting various text into diff. variables using REGEXP

Replies are listed 'Best First'.
Re: Getting various text into diff. variables using REGEXP
by ikegami (Patriarch) on Oct 07, 2009 at 05:28 UTC

    Since you asked for a regex solution:

    local our %linked_counts_by_abbr; '' =~ m{(?{ use XML::LibXML qw( ); my $parser = XML::LibXML->new(); my $doc = $parser->parse_file($ARGV[0]); my $root = $doc->documentElement(); for my $usage_node ( $root->findnodes('/BookReferences/BookUsage') ) { my $abbr = $usage_node->getAttribute('BookAbbr'); my $linked_count = $usage_node->getAttribute('LinkedCount'); $linked_counts_by_abbr{$abbr} += $linked_count; } })}x;

    Personally, I'd drop the regex.

    use XML::LibXML qw( ); my $parser = XML::LibXML->new(); my $doc = $parser->parse_file($ARGV[0]); my $root = $doc->documentElement(); my %linked_counts_by_abbr; for my $usage_node ( $root->findnodes('/BookReferences/BookUsage') ) { my $abbr = $usage_node->getAttribute('BookAbbr'); my $linked_count = $usage_node->getAttribute('LinkedCount'); $linked_counts_by_abbr{$abbr} += $linked_count; }

    XML::LibXML