package Ernad::Args; use strict; use warnings; use Carp qw(confess); use File::Basename; use Ernad::Constant; use Ernad::FileInfo; sub parse { my $in=shift // $ARGV[0] // confess "I need an input here."; if($ARGV[1]) { ## old-fashioned invocation if($in=~m|^([a-z]{3,4})| and $ARGV[1]=~m|^([a-z]{3,4})-([a-z0-9]{3,6})$|) { $main::impna="$1"; $main::repcode=$ARGV[1]; if($ARGV[2] and $ARGV[2]=~m|^\d{4}-\d{2}-\d{2}$|) { $main::issuedate=$ARGV[2]; } ## daring! shift @ARGV; return; } ## impna + issuedate invocatiion if($in=~m|^([a-z]{3,4})| and $ARGV[1]=~m|^(\d{4}-\d{2}-\d{2})$|) { $main::impna=$ARGV[0]; $main::issuedate=$ARGV[1]; ## daring! shift @ARGV; return; } } if($in=~m|^([a-z]{3,4})$|) { $main::impna="$1"; $main::repcode=''; return; } if($in=~m|^([a-z]{3,4})-([a-z0-9]{3,6})$|) { $main::impna="$1"; $main::repcode="$1-$2"; if(defined($ARGV[1]) and $ARGV[1]=~m|\d{4}-\d{2}-\d{2}|) { $main::issuedate=$ARGV[1]; ## daring! shift @ARGV; return; } return; } if(-f $in) { if(&is_rif($in)) { $main::impna=&Ernad::FileInfo::impna($in,'do_strict'); $main::issuedate=&Ernad::FileInfo::issuedate($in,'do_strict'); $main::repcode=&Ernad::FileInfo::repcode($in); $main::in_file=$in; return; } elsif(-f $in) { $main::impna=&Ernad::FileInfo::impna($in); $main::issuedate=&Ernad::FileInfo::issuedate($in); $main::repcode=&Ernad::FileInfo::repcode($in); if(not $main::issuedate) { warn "Ernad::Args warns: I do not see the issuedate in '$in'."; } $main::in_file=$in; return; } } ## $main::impna=$in; $main::repcode=''; } ## special parse for learning files, only used with files sub parse_learn { my $file=shift // $ARGV[0] // confess "I need an input here."; if(not -f $file) { confess "I can't see your file '$file'"; } $main::in_file=$file; my $bana=basename($file); if($bana=~m|\.gz|) { $bana=substr($bana,0,len($bana-3)); } if(not $bana=~m|\.train$|) { confess "I can only handle train files"; } my $repcode=basename(dirname($file)); ## if a relative file name if(not $repcode or $repcode eq '.') { my $pwd=`pwd`; chomp $pwd; my $fufi="$pwd/$file"; $repcode=basename(dirname($fufi)); } if(not $repcode) { confess "I can't finde the repcode from $file"; } $main::repcode=$repcode; ## FixMe: this is not really the doktrine my $impna=$repcode; $impna=~s|([^-]+)-.*|$1|; if($bana=~m|([a-z0-9]+)\.train$|) { $main::ranid=$1; } $main::impna=$impna; } sub is_rif { my $in=shift; my $rif_ext=$Ernad::Constant::c->{'rif_ext'}; if($in=~m|$rif_ext$|) { return 1; } if($in=~m|$rif_ext\.gz$|) { return 1; } return 0; } 1;