Как распечатать использование программы в Perl?

Как проще всего поддерживать способ печати использования программы Perl в stdout? Я ищу трюки heredoc или что-то подобное полезное. Забудьте отдельные последовательные отпечатки.

EDIT 1: проблема, с которой я сталкивался много раз, заключается в том, чтобы поддерживать использование, общую документацию сценария и обработку опций отдельно. Я искал способ объединить некоторые или все это с минимальными накладными расходами. Спасибо за множество предложений. Я приму ответ, когда у меня будет возможность экспериментировать с предлагаемыми решениями.

5 ответов


Pod::Usage может? Это было предложено GetOpt::Long.

Getopt::Std::WithCheck позволяет объединить определение параметров вдоль описания, и Getopt::Simple делает то же самое.


Я думаю, вы только что ответили на свой вопрос. Предложение heredoc является обычным способом, если информация об использовании не генерируется автоматически (например,Getopt::Long:: Описательный или MooseX:: Getopt).

package ClassA;
use Getopt::Long::Descriptive;

my ($opt, $usage) = describe_options(
    'my-program %o <some-arg>',
    [ 'server|s=s', "the server to connect to"                  ],
    [ 'port|p=i',   "the port to connect to", { default => 79 } ],
    [],
    [ 'verbose|v',  "print extra stuff"            ],
    [ 'help',       "print usage message and exit" ],
);

print($usage->text), exit if $opt->help;


package ClassB;
use Moose;
with' MooseX::Getopt';

has server => (
    is => 'ro', isa => 'Str',
    traits    => [ 'Getopt' ],
    cmd_aliases => ['s'],
    documentation => 'the server to connect to',
);
has port => (
    is => 'ro', isa => 'Int',
    traits    => [ 'Getopt' ],
    cmd_aliases => ['p'],
    default => 79,
    documentation => 'the port to connect to',
);
has verbose => (
    is => 'ro', isa => 'Bool',
    traits    => [ 'Getopt' ],
    cmd_aliases => ['v'],
    documentation => 'print extra stuff',
);

вы можете вызвать ClassB так (если вы не используете MooseX::Runnable или скрипт для создания объекта):

    perl -I. -MClassB -wle'my $obj = ClassB->new_with_options;' -- --help

и производит:

    usage: -e [-?psv] [long options...]
            -? --usage --help  Prints this usage information.
            -s --server        the server to connect to
            -p --port          the port to connect to
            -v --verbose       print extra stuff

что-то типа :

print <<END;
Usage : foo bar

Foobar foobar.
END

?


Дамиан Конвей имеет два интересных модуля, которые используют документацию интерфейса командной строки для создания кода синтаксического анализа:

  • Getopt:: Euclid: объявите свой интерфейс в POD
  • Getopt:: Declare: объявите свой интерфейс в строке, которую вы можете вывести в случае ошибки

Они помогут (заставят) Вас поддерживать документацию, соответствующую коду.


вы можете использовать здесь-doc:

use Getopt::Long;

my $USAGE = <<"USAGE";
Usage: some_script.pl -env=[dev|qa|pr]

Regular options:

-env        -- Valid values for env are 'dev', 'qa', 'pr'

USAGE

our ($opt_env);

die $USAGE
  unless GetOptions ("env=s"   => $opt_env); # string