Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.9.115] |
|
Сообщ.
#1
,
|
|
|
Добрый день. Подскажите пожалуйсто как реализовать передача аргументов скрипту Perl:
во всех крутых скриптах параметры передаются типа: script.pl -url htpp://asdasfa.ru -port 80 -method GET -f file.txt т.е. не просто строка идёт но и ключи. -port -method -f. помогите пожалуйсто как реализовать приём тех параметров чтобы их ассоциировать и с ключами и за пихать в нужные переменные. проблема в том что и ключи и сами параметры пихаются в $ARGV. Ну вы меня поняли? Спасибо. |
Сообщ.
#2
,
|
|
|
Getopt спасёт отца русской демократии.
Для примера рабочий скриптик, который запускается прогой на С++ с некоторой кучкой параметров, работать, правда, не будет т.к. вызывает самопальные модули, но как работать с параметрами там есть, так как скрипт собственно и делает только разбор параметров и вызов соответсвующего обработчика с передачей параметров ему. Тут все параметры запихиваются в один хэш, чтоб не плодить кучу переменных. #!/bin/perl -w =head Script for parsing RPM Daily Files for YaNDAC System =cut use strict; use Getopt::Long (); use Time::HiRes qw(gettimeofday); use DailyFiles::DailyFiles; use DailyFiles::YAFI; use DailyFiles::Aspect; use DailyFiles::TSA; my %formats = ( 1 => 'YAFI', 2 => 'Aspect', 3 => 'TSA' ); use constant RESARGS => 100; # - illegal arguments my %opts; #constant my $dbname = 'ndac'; my $dummy; #workaround warnings of interpreter #only for script time measure my $t0 = gettimeofday; #see usage() for argument's descriptions Getopt::Long::GetOptions( 'file=s' => \$opts{'f'}, 'type-format=i' => \$opts{'t'}, 'server:s' => \$opts{'s'}, 'login=s' => \$opts{'l'}, 'password=s' => \$opts{'p'}, 'help' => \$opts{'h'}, 'verbose' => \$opts{'v'}, 'disconn=i' => \$opts{'d'}, 'ginterval=i' => \$opts{'g'}, 'ninterval=i' => \$opts{'n'}, 'increment=i' => \$opts{'i'}, #for debug only!!! ) or usage(RESARGS); usage($opts{'h'} ? 0 : RESARGS) if( $opts{'h'} || !$opts{'l'} || !$opts{'p'} || !$opts{'f'} || !$opts{'t'} ); $opts{'s'} = 'localhost:3306' if !$opts{'s'}; my ($ip, $port) = split(/:/, $opts{'s'}); $port = '3306' if !$port; if( $ip ne 'localhost' ) { my $ip_failed = 1; if( $ip =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ ) { $ip_failed = 0; foreach my $d (($1, $2, $3, $4)) { if( $d < 0 || $d > 255 ) { $ip_failed = 1; last; } } } $ip_failed = 1 if( $port < 0 || $port > 65535 ); (($dummy = $! = RESARGS) and ($opts{'v'} ? die "illegal server: $opts{'s'}\n" : exit $!)) if $ip_failed; } my $dsn = 'DBI:mysql:' . $dbname . ':' . $opts{'s'}; my $processor = 'DailyFiles::' . $formats{$opts{'t'}}; my $df = DailyFiles::DailyFiles::new ($processor, DSN => $dsn, # MySQL DSN string DBNAME => $dbname, # NDAC database name DBLOGIN => $opts{'l'}, # MySQL login DBPASS => $opts{'p'}, # MySQL password DFILE => $opts{'f'}, # Full Path to DF filename DISCONNINTRV => $opts{'d'}, # interval for register disconnection event GINTRV => $opts{'g'}, # measure points time interval for gamma, ms NINTRV => $opts{'n'}, # measure points time interval for neutron, ms VERBOSE => $opts{'v'}, # be verbose ); my $res = $df->parse(); sub usage { print STDOUT << "EUSAGE"; usage: $0 -f FILENAME -t TYPE [-s MYSQLDBSERVIP:PORT] -l mysqllogin -p mysqlpasswd [-d SECS] [-v] [-c] [-g MSECS] [-n MSECS] [-h] -f, --file - file name for parsing -t, --type-format - file format (YAFI - 1, Aspect - 2, TSA - 3) -s, --server - ip-address[:port] of MySQL DB server, localhost:3306 by default -l, --login - user login for connect to MySQL DB -p, --password - user password for connect MySQL DB -d, --disconn - disconnect interval between row's times, secs -v, --verbose - be verbose and out to stdout -g, --ginterval - measure points time interval for gamma, ms -n, --ninterval - measure points time interval for neutron, ms -h, --help - this help output Return values: 0 - ok 100 - illegal arguments 101 - illegal file name 102 - illegal short file name 103 - error connect to MySQL 104 - error query to MySQL 105 - no correspond RPM found in RPM List 106 - no correspond database for RPM found 107 - invalid count of gamma counting channels 108 - invalid count of neutron counting channels other - system error EUSAGE exit $_[0]; } if( $opts{'v'} ) { my $elapsed = gettimeofday - $t0; printf("Script run $elapsed secs.\n"); printf("\tLines statistics:\n"); my $rc = $df->statistics(); foreach my $key (sort keys %$rc) { printf("\t\t$key\t\t$rc->{$key}\n"); } } exit($res); Добавлено Подсветка кода хитро работает - кучу пробелов понавставила. |