2011-02-09 4 views
0

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

Рассмотрим следующую команду:

./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

Ваш код представляет собой странную комбинацию из двух различных функций 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 после каждого варианта указать, что он принимает аргумент.

Редактировать: обновлен ответ на каждое разъяснение ниже.

+0

благодарит за ответ. но я думаю, что я объясню проблему неправильно.Я определил% hash, потому что у меня есть более 50 опций в каждой команде, эти параметры статичны, я должен быть в состоянии получить их с их значениями (например, --ip localhost) из команды. это моя проблема. Если Im не ясно, пожалуйста, дайте мне знать, чтобы объяснить больше. –

+0

@Matt Ston: Я обновил ответ. Прямо сейчас список параметров генерируется из массива @options. Таким образом, вы можете передать произвольное количество ожидаемых параметров. – bvr

+0

В соответствии с вашим кодом, как я могу напечатать элемент @options i, означает параметр и связанный с ним аргумент так же, как тот, который вы предупреждаете о карте в хэш-формате? –

1

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

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

спасибо дорогой erickb за вашу помощь. но я не имею в виду это;) –

1

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

Метод «домашний рост» использует карту и объединяется для создания списка опций. (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} 
+0

Большое вам спасибо, вы даже не представляете, насколько я счастлив сейчас :) –

+0

За последний вопрос: как я могу получить аргумент внутри другого метода, у меня есть метод, который отправляет эти аргументы через почту функция. что-то вроде этого: 'my $ TicketID = $ TicketObject-> TicketCreate ( \t # Я хочу получить значение id, ip и class, этот пользователь вводит команду id => '?', class => '? ', ip =>'? ', ); ' –

+0

Это не сложно: DI получил ответ. проблема решена снова спасибо :) –

0

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

  1. получить Вас в современный OO Perl

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

Оформить заказ MooseX :: Приложение :: Cmd. Это поможет вам отделить свою логику. Или App :: Cmd, если вы еще не хотите пить посох Moose.

+0

Я проверю это, спасибо :) –

Смежные вопросы