Как я могу передать флаги командной строки с помощью ARGV, указав определенный порядок флагов?

Я хочу интегрировать использование ARGV в свой сценарий. Поработав с примером простого использования, который я нашел в Stack Overflow, я смог заставить скрипт «принудительно» использовать аргументы одной команды. То, что я хочу сделать сейчас, это разрешить использование нескольких флагов вместо одного. Уловка заключается в том, что флаги должны применяться в определенном порядке, если их несколько.

Вот код, который я придумал для выполнения одиночных аргументов и их применения.

#!/usr/bin/perl
use strict;
use warnings;

system ("clear");
print "Solignis's Discovery Script v0.6 for ESX\\ESX(i) 4.0+\n\n";

my $numargs = $#ARGV + 1;

if ($#ARGV < 0) {
    help_menu();
}

foreach my $argval (0 .. $#ARGV) {
    if (($#ARGV == 0) && ($ARGV[0] eq '-b')) {
        print "Backup\n";
    } elsif (($#ARGV == 0) && ($ARGV[0] eq '-d')) {
        print "Discovery\n";
    } elsif ((($#ARGV == 0) && ($ARGV[0] eq '-h') || ($#ARGV == 0) && ($ARGV[0] eq '-?'))) {
        help_menu();
    } elsif (($#ARGV == 0) && ($ARGV[0] eq '-s')) {
        print "Setup\n"
    }
}

if ($#ARGV >= 1) {
    print "Too many arguments, only one argument may be passed at a time!\n";
}

sub help_menu {
    print "Options:\n\n";
    print "\t-b\tRun Backup Backup\n";
    print "\t-d\tRun Discovery Script\n";
    print "\t-h\tShow Help Menu\n";
    print "\t-s\tRun Setup Script\n\n";
}

person ianc1215    schedule 20.01.2011    source источник
comment
Почему они должны быть в определенном порядке?   -  person Fred Foo    schedule 20.01.2011
comment
Потому что я не хочу, чтобы кто-то пытался запустить «-b» (резервное копирование) перед «-s» (настройка), потому что сценарий сойдет с рельсов.   -  person ianc1215    schedule 20.01.2011


Ответы (1)


Используйте основной модуль Getopt::Long и не беспокойтесь о разборе аргументов самостоятельно.

Если у вас есть несколько аргументов, вместо того, чтобы делать то, что они говорят, в том порядке, в котором они говорят, вы просто делаете что-то вроде следующего псевдокода:

if( option s is set ) {
  run setup stuff
}
if( option b is set ) {
  run backup stuff
}

Нет абсолютно никаких причин, по которым ваш сценарий должен разрешать аргументы как -s -b, а не -b -s. Ваши пользователи будут ожидать, что если они предоставят -b -s, сначала будет выполнена настройка, а затем резервное копирование. Ваш сценарий должен быть достаточно умным.

person CanSpice    schedule 20.01.2011
comment
Я вижу, поэтому у меня немного туннельное зрение. Мне нужен код для логики, чтобы проверить, какие шаги были сделаны, верно? - person ianc1215; 20.01.2011
comment
Если вы можете запустить резервное копирование только в том случае, если настройка была выполнена, и если шаги выполняются только в том случае, если пользователь явно запрашивает их (т.е. если пользователь запрашивает резервное копирование, но не настройку, и вам требуется выполнить настройку перед резервным копированием), тогда да , вам, вероятно, нужно проверить, выполнили ли вы настройку перед резервным копированием. Но это не имеет ничего общего с параметрами командной строки и имеет отношение к тому, как вы написали остальную часть своей программы. - person CanSpice; 20.01.2011
comment
Ясно, ну, похоже, у меня впереди долгая ночь. - person ianc1215; 20.01.2011