Вы можете сделать это с помощью Getopt::Long::Descriptive
. Это немного отличается от Getopt::Long
, но если вы печатаете сводку об использовании, это помогает уменьшить дублирование, делая все это за вас.
Здесь я добавил скрытую опцию с именем source
, поэтому $opt->source
, которая будет содержать значение dir
или files
в зависимости от того, какая опция была задана, и будет применять ограничение one_of
вы. Указанные значения будут в $opt->dir
или $opt->files
, в зависимости от того, какое из них было дано.
my ( $opt, $usage ) = describe_options(
'%c %o',
[ "source" => hidden => {
'one_of' => [
[ "dir=s" => "Directory" ],
[ "files=s@" => "FilesComma-separated list of files" ],
]
} ],
[ "man" => "..." ], # optional variable with default value (false)
[ "verbose" => "Provide more output" ], # optional variable with default value (false)
[],
[ 'help|?' => "Print usage message and exit" ],
);
print( $usage->text ), exit if ( $opt->help );
if ($opt->files) {
@files = split(/,/,join(',', @{$opt->files}));
}
Основным отличием остальной части вашего сценария является то, что все параметры содержатся в качестве методов переменной $opt
, а не в каждой, имеющей собственную переменную, как в Getopt::Long
.