На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Передача аргументов скрипту Perl , Помогите разобраться
      Добрый день. Подскажите пожалуйсто как реализовать передача аргументов скрипту Perl:
      во всех крутых скриптах параметры передаются типа: script.pl -url htpp://asdasfa.ru -port 80 -method GET -f file.txt

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


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

        ExpandedWrap disabled
          #!/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);


        Добавлено
        Подсветка кода хитро работает - кучу пробелов понавставила.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0273 ]   [ 15 queries used ]   [ Generated: 27.04.24, 16:31 GMT ]