LINUX.ORG.RU

use Const::Fast qw( const );
use Pod::Usage qw( pod2usage );
use Getopt::Long 2.24 qw( :config no_auto_abbrev no_ignore_case );

const my $SHOW_USAGE_ONLY         => 0;
const my $SHOW_BRIEF_HELP_MESSAGE => 1;
const my $SHOW_FULL_MANUAL        => 2;

const my $RETURN_SUCCESS     => 0;
const my $RETURN_FATAL_ERROR => 1;
const my $RETURN_BAD_OPTIONS => 2;

my ( $path_to_config_file ) = do {
    my $options_okay = GetOptions(
        'help'    => \my $help_requested,
        'conf=s' => \my $path_to_config_file,
    );

    # show appropriate help message
    pod2usage( -exitval => $RETURN_BAD_OPTIONS, -verbose => $SHOW_USAGE_ONLY )
        unless $options_okay;

    pod2usage( -exitval => $RETURN_SUCCESS, -verbose => $SHOW_FULL_MANUAL )
        if $help_requested;

    # check required options
    pod2usage(
        -exitval => $RETURN_BAD_OPTIONS,
        -message => 'required parameter "conf" not defined',
        -verbose => $SHOW_USAGE_ONLY,
    ) unless $path_to_config_file;

    ( $path_to_config_file );
};

__END__

=head1 NAME

scriptname.pl

=head1 USAGE

scriptname.pl --help

scriptname.pl --conf=./conf.pm

=head1 DESCRIPTION

=head1 EXIT STATUS

0 - программа выполнена успешно
1 - критическая ошибка программы
2 - неверные параметры командной строки

=cut
outtaspace ★★★
()

Еще один вариант, если вы юзаете тяжелые ООП-системы, такие как Moose.

use MooseX::Declare;

class CommandLineOptions {
    with 'MooseX::Getopt';

    has conf => (
        is       => 'ro',
        isa      => 'Str',
        required => 1,
        reader   => 'path_to_config',
    );
}

42;

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Имхо запутанный код, особенно напрягает тройное использование «$path_to_config_file». Более того при опциях более 5 приходится писать их в капсе/префиксом/суффиксом/киллометровые строки вобщем. Другой способ:


use vars qw($PROGRAM_NAME $VERSION $DOCPATH);
$PROGRAM_NAME = 'testprog'; $VERSION  = '1.0';
$DOCPATH = "$ENV{HOME}/doc/testprog.pod";

use Pod::Usage;
use Getopt::Long qw(:config no_ignore_case bundling);
GetOptions(\my %options, 'help|h', 'man', 'version|v');

pod2usage(-exitval => 1, -input => $DOCPATH, -verbose => 1, -noperldoc => 1)
  if (exists $options{'help'});

pod2usage(-exitval => 0, -input => $DOCPATH, -verbose => 2, -noperldoc => 1)
  if (exists $options{'man'});

if (exists $options{'version'}) {
  print "$PROGRAM_NAME version $VERSION\n";
  exit 0;
}

Можно обойтись и без $DOCPATH - просто убираем опцию -input.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Да, далекий от универсализма метод. Стараюсь юзать переменные подкрепленные strict-семантикой пока есть для этого возможности. Отсюда и переменные, а не hash.

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

outtaspace ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.