Управление аргументами в Perl с помощью Getopt :: Long - PullRequest
2 голосов
/ 13 марта 2011

Я пытаюсь использовать Getopt :: Long для добавления аргументов командной строки в мой скрипт (см. Ниже). Проблема, с которой я сталкиваюсь, связана с несколькими командами, которые делают разные вещи. Например, у меня есть флаг опции, который устанавливает файл конфигурации для использования со сценарием, опция -c [config_path], и у меня также есть -h для помощи.

Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно иметь условие, в котором указано, использовалась ли опция конфигурации И был ли указан файл конфигурации. Я попытался подсчитать опции в @ARGV, но обнаружил, что если указаны -h и -c, это заставляет скрипт перейти в подпрограмму load_config в любом случае. Потому что, как видно из кода ниже, когда в @ARGV найдено 2 аргумента, она запускает подпрограмму.

Каким образом я могу это исправить? По крайней мере, в моей голове указание -h и -c одновременно противоречит друг другу. Есть ли способ сделать так, чтобы только «информационные команды», такие как помощь, не могли быть выполнены с «оперативными командами», такими как -c? Черт, есть ли способ, где я получаю список команд, которые были переданы? Я попытался распечатать содержимое @ARGV, но в нем ничего не было, хотя я указал аргументы команды.

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Term::ANSIColor;
use XML::Simple;
use Net::Ping;
use Net::OpenSSH;
use Data::Dumper;

# Create a new hash to copy XML::Simple configuration file data into
my %config_file;

# Clear the screen and diplay version information
system ("clear");
print "Solignis's Backup script v0.8 for ESX\\ESX(i) 4.0+\n";
print "Type -h or --help for options\n\n";

# Create a new XML::Simple object
my $xml_obj = XML::Simple->new();

# Create a new Net::Ping object
my $ping_obj = Net::Ping->new();

my $config_file;

my $argcnt = $#ARGV + 1;

GetOptions('h|help' => \&help, 
       'c|config=s' => \$config_file
      );

if ($argcnt == 0) {
    print "You must supply a config to be used\n";
} elsif ($argcnt == 2) {
    if (! -e $config_file) {
        print color 'red';
        print "Configuration file not found!\n";
        print color 'reset';
        print "\n";
        die "Script Halted\n";
    } else {
        load_config();
    }
}

sub load_config {

    print color 'green';
    print "$config_file loaded\n";
    print color 'reset';

    my $xml_file = $xml_obj->XMLin("$config_file",
                    SuppressEmpty => 1);

    foreach my $key (keys %$xml_file) {
            $config_file{$key} = $xml_file->{$key};
    }

    print Dumper (\%config_file);
}

sub help {
    print "Usage: backup.pl -c [config file]\n";
}

Ответы [ 4 ]

8 голосов
/ 13 марта 2011

@ ARGV изменяется GetOptions, поэтому он кажется пустым. Вместо подсчета аргументов, просто проверьте, определено ли $config_file.

Кстати, IMO нет необходимости пытаться исключить -c из использования с -h. Обычно «справка» просто печатает текст справки и завершает работу, не предпринимая никаких других действий. Сначала проверьте это, и не имеет значения, введен -c или нет.

3 голосов
/ 13 марта 2011

Что-то вроде

my $help;
my $config_file;

GetOptions('h|help' => \$help, 
   'c|config=s' => \$config_file
  );

if ( defined $help ) {
   help();
} elsif ( defined $config_file ) {
   ...;
} else {
   die "No arguments!";
}
0 голосов
/ 14 марта 2011

Вы всегда можете установить значение по умолчанию для параметров, например, my $help = 0; my $config_file = "";, а затем проверить эти значения.

0 голосов
/ 14 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...