Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Perl > Передача аргументов скрипту Perl


Автор: _SEREGA_ 02.04.11, 17:20
Добрый день. Подскажите пожалуйсто как реализовать передача аргументов скрипту Perl:
во всех крутых скриптах параметры передаются типа: script.pl -url htpp://asdasfa.ru -port 80 -method GET -f file.txt

т.е. не просто строка идёт но и ключи. -port -method -f. помогите пожалуйсто как реализовать приём тех параметров чтобы их ассоциировать и с ключами и за пихать в нужные переменные. проблема в том что и ключи и сами параметры пихаются в $ARGV. Ну вы меня поняли? Спасибо.

Автор: Adil 03.04.11, 06:10
Getopt спасёт отца русской демократии.


Для примера рабочий скриптик, который запускается прогой на С++ с некоторой кучкой параметров, работать, правда, не будет т.к. вызывает самопальные модули, но как работать с параметрами там есть, так как скрипт собственно и делает только разбор параметров и вызов соответсвующего обработчика с передачей параметров ему.
Тут все параметры запихиваются в один хэш, чтоб не плодить кучу переменных.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #!/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);


Добавлено
Подсветка кода хитро работает - кучу пробелов понавставила.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)