Perl. Разбор аргументов скрипта
Вещь совсем тривиальная и простая как валенок, но пусть будет. Среди наших перловых костылей часто натыкаюсь на скрипты, принимающие на вход целый паровоз безымянных параметров и поди угадай, что бы это значило. Выглядит примерно так: mysupertrouperscript.pl 592 1 1 2010-01-01. Чтобы разобраться в природе всех этих чисел приходится смотреть в исходный код и искать, каким образом обрабатываются входные аргументы. Другая проблема в том, что нельзя изменить порядок следования аргументов, а в некоторых случаях, и исключить какие-то из них.
Решение состоит в замене входных параметров конструкциями вида --argname[=value], разбирать немногим сложнее, зато вызов скрипта становится нагляднее:
В этом разе параметры запуска скрипта более очевидны, а их порядок следования не такой строгий:
mysupertrouperscript.pl --id=592 --date=2010-01-01 --print --debug
Решение состоит в замене входных параметров конструкциями вида --argname[=value], разбирать немногим сложнее, зато вызов скрипта становится нагляднее:
#!/usr/bin/perl
# mysupertrouperscript.pl
# mysupertrouperscript.pl
use strict;
...
my $ID = 0;
my $DATE = '0000-00-00';
my $PRINT = 0;
my $DEBUG = 0;
sub parse_args {
...
my $ID = 0;
my $DATE = '0000-00-00';
my $PRINT = 0;
my $DEBUG = 0;
sub parse_args {
my $f_date = 0;
for (my $i = 0; $i < scalar(@ARGV); $i++) {
for (my $i = 0; $i < scalar(@ARGV); $i++) {
$ID = $1 if ($ARGV[$i] =~ /--id=(\d+)/);
if ($ARGV[$i]=~/--date=(\d{4}-\d{1,2}-\d{1,2} )/) {
$DATE = $1;
$f_date = 1;
}
$PRINT = 1 if ($ARGV[$i] =~ /--print/);
$DEBUG = 1 if ($ARGV[$i] =~ /--debug/);
}
warn "WARNING: date is not defined, $DATE will be used.\n"if ($f_date == 0);
if ($ID == 0) {
warn "ERROR: identifier is not defined.\n";
exit 1;
}
warn "INFO: print mode is on\n" if ($PRINT > 0);
warn "INFO: debug mode is on\n" if ($DEBUG > 0);
}
...
parse_args();
...
if ($ARGV[$i]=~/--date=(\d{4}-\d{1,2}-\d{1,2}
$DATE = $1;
$f_date = 1;
}
$PRINT = 1 if ($ARGV[$i] =~ /--print/);
$DEBUG = 1 if ($ARGV[$i] =~ /--debug/);
}
warn "WARNING: date is not defined, $DATE will be used.\n"if ($f_date == 0);
if ($ID == 0) {
warn "ERROR: identifier is not defined.\n";
exit 1;
}
warn "INFO: print mode is on\n" if ($PRINT > 0);
warn "INFO: debug mode is on\n" if ($DEBUG > 0);
}
...
parse_args();
...
В этом разе параметры запуска скрипта более очевидны, а их порядок следования не такой строгий:
mysupertrouperscript.pl --id=592 --date=2010-01-01 --print --debug