package PubMed::Common; use strict; use warnings; use Carp qw(confess); use Data::Dumper; use File::Basename; use XML::LibXML; # use File::Temp; sub pmid_to_pemi { my $num=shift; while(length($num)<3) { $num='0'.$num; } $num=substr($num,-3,3); return $num; } sub load_and_return_xml { my $file=shift; if (not -f $file) { confess "I have no such file $file"; } my $fh; if($file=~m|\.gz$|) { open $fh , "/bin/gunzip -c $file |"; } else { open $fh, '<', $file; } binmode $fh; my $doc; local $XML::LibXML::skipXMLDeclaration = 1; eval { $doc = XML::LibXML->load_xml(IO => $fh); }; if(ref $doc ne 'XML::LibXML::Document') { confess "I could not parse file '$file'\nLibXML says $@\n"; } return $doc; } sub get_pmid { my $meci=shift; my $ref_meci=ref $meci; if($ref_meci ne 'XML::LibXML::Element') { confess "I need an element, not a '$ref_meci'"; } my $pmid_elements=$meci->getElementsByTagName('PMID'); foreach my $pmid_element ($pmid_elements->get_nodelist()) { if($pmid_element->parentNode->nodeName eq 'MedlineCitation') { my $pmid=$pmid_element->textContent; if($pmid=~m|^\d+$|) { return $pmid; } confess "I have a bad pmid: '$pmid'"; } } confess "I don't see a pmid in $meci"; } sub isatty() { no autodie; my $tty; if(open($tty, '+<', '/dev/tty')) { close $tty; return 1; } return 0; } sub deal_with_files { my $dir=shift // confess "I need a directory here."; my $regx=shift // confess "I need a regx here."; my $fun_ref=shift // confess "I need a fun_ref here."; my $verbose=shift // confess "I need a verbosity parameter here."; # my $pat=shift // confess "I need a pattern here"; my @args=@_; ## extra security my $real=shift // ''; my $out={}; foreach my $fufi (glob("$dir/*")) { my $bana=basename($fufi); if($regx and not $bana=~m|$regx|) { if($verbose) { print "I skip $bana, because it does not match '$regx'.\n"; } next; } elsif($verbose) { print "I take $bana.\n"; } my $fufi="$dir/$bana"; if(not -f $fufi) { confess "I can't open $fufi"; } $out->{$bana}=&{$fun_ref}($fufi,@args); } return $out; } 1;