Получение параметров командной строки и их значений - PullRequest
0 голосов
/ 09 февраля 2011

Я хочу регистрировать параметры и их аргументы из пользовательской команды после запуска скрипта.

Рассмотрим эту команду:

./test.pl --ip localhost --id 400154 --class firstgrade 

... и многие другие параметры и значения. Мой желаемый вывод будет выглядеть следующим образом (используя log4perl):

debug - ip=>localhost id=>400154 class=>firstgrade 

Я делаю:

use Getopt::Long; 
my $ip;
my $id; 
my $class;
my %h =('ip' => \$ip,
        'id' => \$id,
    'class' => \$class);
GetOptions(\%h);
$logger->debug(join('=>',%h));

но это не работает. Пожалуйста, помогите.

Ответы [ 4 ]

4 голосов
/ 09 февраля 2011

Ваш код представляет собой странную комбинацию двух различных функций Getopt::Long - он может разбирать параметры в хэш или заполнять отдельные параметры в переменных. Можно даже поместить часть в хеш, а остальные - в переменные.

Это должно работать:

use Getopt::Long;

my @options = qw(ip id class);
my %h = ();
GetOptions(\%h,
    map { "$_:s" } @options
) or die "Could not parse";
warn map { "$_=>$h{$_} " } keys %h;

Это вариант, в котором проанализированные параметры помещаются в хеш. Примечание :s после каждого параметра указывает, что он принимает аргумент.

Изменить: обновленный ответ в соответствии с разъяснениями ниже.

1 голос
/ 10 февраля 2011

Следующий код демонстрирует два способа достижения того, что вы хотите.

В методе home home используется map и join для создания списка опций.(Grep исключает опции undef. Вы можете удалить часть grep {}.)

Метод Data :: Dumper может быть желателен, поскольку он доступен для оценки.


#!/usr/bin/env perl

use strict;
use warnings;

use Getopt::Long qw(:config gnu_getopt);
use Data::Dumper;
$Data::Dumper::Sortkeys = 1;
$Data::Dumper::Indent = 0;
$Data::Dumper::Terse = 1;

my %opts = (
  dir => undef,
  verbose => 0,
  silent => 0,
 );

GetOptions(\%opts,
           'dir|d=s',
           'verbose|v+',
           'silent+',
          )
  or die("Usage: blah\n");

# also see Getopt::Long perldoc for pod2usage

print( "home grown:\n",
       join(" ", map { sprintf('%s=>%s',$_,$opts{$_}||'undef') } 
              grep {defined $opts{$_}} keys %opts ),
       "\n" );

print( "Dumper:\n",
       Dumper(\%opts), 
       "\n" );

Пример:

apt12j$ ~/tmp/x.pl  -vv --silent
home grown:
verbose=>2 silent=>1
Dumper:
{'dir' => undef,'silent' => 1,'verbose' => 2}
1 голос
/ 09 февраля 2011

Попробуйте это:

my $ip = ""; my $id = ""; my $class= "";
GetOptions('ip=s' => \$ip, 'id=s' => \$id, 'class=s' => \$class);
print "debug - ip=>$ip id=>$id, class=>$class";

И вам, вероятно, следует назвать это так:

./test.pl --ip localhost --id 400154 --class firstgrade
0 голосов
/ 10 февраля 2011

Оформить заказ MooseX :: Getopt, это поможет вам в два раза:

  1. познакомит вас с современным OO Perl

  2. создать суперпростые приложения командной строки.

Оформить заказ MooseX :: App :: Cmd.Это также поможет вам отделить вашу логику.Или App :: Cmd, если вы пока не хотите пить Moo-kool-aid.

...