use warnings; use strict; package Signif::RetentionRates; use fields qw{file_name sem_to_rate}; use XML::Parser::Expat; sub Load { my $type = shift(@_); my $libraries = shift(@_); my $file_name = shift(@_); my Signif::RetentionRates $rates = fields::new($type); my $table = $rates->{sem_to_rate} = {}; my $file; my $full_name; foreach my $dir (@$libraries) { $full_name = qq{$dir/$file_name}; last if (defined(open($file, q{<}, $full_name))); } if (!defined($file)) { die(qq{Data file `$file_name' not found for retention rates.}); } $rates->{file_name} = $full_name; my $parser = XML::Parser::Expat->new(); $parser->setHandlers( q{Start} => sub {my($p, $element, %attrs) = @_; if ($element eq q{word}) { my $sem = $attrs{sem}; my $retention = $attrs{retention}; die($sem) unless defined($sem) and $sem =~ m{^[A-Z]+$}; die($retention) unless defined($retention) and $retention =~ m{^\d+$}; $table->{$sem} = $retention; }} ); $parser->parse($file); close($file); $parser->release(); return $rates; } sub for_sem { my Signif::RetentionRates $rates = shift(@_); my $sem = shift(@_); if (!exists($rates->{sem_to_rate}->{$sem})) { die(qq{No retention rate known for sem {$sem}}); } return $rates->{sem_to_rate}->{$sem}; } 1;