加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 如何在pod2usage中指定宽度?

发布时间:2020-12-16 06:25:25 所属栏目:大数据 来源:网络整理
导读:我有一个小的perl模块,我正在使用Getopt :: Long,我想我也可以使用Pod :: Usage来获得漂亮的帮助显示. 经过一番摆弄后,我得到了相当好的工作,只有一个小例外.我无法设置输出的宽度. 我的终端是191个字符宽.使用perldoc Module.pm,它正确地将文档格式化为该宽
我有一个小的perl模块,我正在使用Getopt :: Long,我想我也可以使用Pod :: Usage来获得漂亮的帮助显示.

经过一番摆弄后,我得到了相当好的工作,只有一个小例外.我无法设置输出的宽度.

我的终端是191个字符宽.使用perldoc Module.pm,它正确地将文档格式化为该宽度.使用pod2usage(),它使用默认宽度76个字符.

我无法弄清楚如何将宽度选项传入格式化程序.该文档展示了如何使用BEGIN块设置不同的格式化程序(如Pod :: Text :: Termcap),并使用Term :: ReadKey来拉宽度(已验证),但我无法将格式化程序设置为看见.

任何提示?

这是我正在尝试测试的完整模块,以及一个加载它的小测试脚本.要明白我的意思,打开一个宽度合理的终端(132或更多,这很明显),并将“./test.pl –man”的输出与“perldoc MUD :: Config”的输出进行比较.

我可以没有perldoc添加的手册页样式页眉和页脚,但我希望它尊重(和使用)终端宽度.

test.pl

#!/usr/bin/perl -w

use strict;
use warnings;

use MUD::Config;
#use MUD::Logging;

my $config = new MUD::Config @ARGV;
#my $logger = new MUD::Logging $config;

#$bootlog->info("Logging initialized");
#$bootlog->info("Program exiting");

和MUD / Config.pm

#!/usr/bin/perl -w

package MUD::Config;

=pod

=head1 NAME

MUD::Config --  Configuration options for PocketMUD

=head1 SYNOPSIS

./PocketMUD [OPTIONS]

=head1 OPTIONS

=over 8

=item B<--dbname>

Specifiy the name of the database used by PocketMUD S<(default B<pocketmud>)>.

=item B<--dbhost>

Specify the IP address used to connect to the database S<(default B<localhost>)>.

=item B<--dbport>

Specify the port number used to connect to the database S<(default B<5432>)>.

=item B<--dbuser>

Specify the username used to connect to the database S<(default B<quixadhal>)>.

=item B<--dbpass>

Specify the password used to connect to the database S<(default B<password>)>.

=item B<--dsn>

The DSN is the full connection string used to connect to the database.  It includes the
values listed above,as well as several other options specific to the database used.

S<(default B<DBI:Pg:dbname=$db_name;host=$db_host;port=$db_port;sslmode=prefer;options=--autocommit=on>)>

=item B<--logfile>

Specify the text file used for debugging/logging output S<(default B</home/quixadhal/PocketMUD/debug-server.log>)>.

=item B<--port>

Specify the port used for player connections S<(default B<4444>)>.

=item B<--help>

Display usage information for PocketmUD.

=item B<--man>

Display full documentation of configuration module details.

=back

=head1 DESCRIPTION

PocketMUD is a perl re-implementation of SocketMUD.

It is meant to be a barebones MUD server,written in perl,which can be easily modified and extended.

=head1 METHODS

=cut

use strict;
use warnings;
use Getopt::Long qw( GetOptionsFromArray );
use Config::IniFiles;
use Data::Dumper;

BEGIN {
    use Term::ReadKey;

    my ($width,$height,$pixel_width,$pixel_height) = GetTerminalSize();
    #print "WIDTH: $widthn";
    $Pod::Usage::Formatter = 'Pod::Text::Termcap';
    $Pod::Usage::width = $width;
}

use Pod::Usage;
use Pod::Find qw(pod_where);

Getopt::Long::Configure('prefix_pattern=(?:--|-)?');    # Make dashes optional for arguments

=pod

B<new( @ARGV )> (constructor)

Create a new configuration class.  You should only need ONE instance of this
class,under normal circumstances.

Parameters passed in are usually the command line's B<@ARGV> array.  Options that
can be specified are listed in the B<OPTIONS> section,above.

Returns: configuration data object.

=cut


sub new {
    my $class = shift;
    my @args = @_;
    my ($db_name,$db_host,$db_port,$db_user,$db_pass,$DSN);
    my ($logfile,$port);
    my $HOME = $ENV{HOME} || ".";

    # Order matters... First we check the global config file,then the local one...
    foreach my $cfgfile ( "/etc/pocketmud.ini","$HOME/.pocketmud.ini","./pocketmud.ini" ) {
        next if !-e $cfgfile;
        my $cfg = Config::IniFiles->new( -file  => "$cfgfile",-handle_trailing_comment => 1,-nocase => 1,-fallback => 'GENERAL',-default => 'GENERAL' );
        $db_name = $cfg->val('database','name')        if $cfg->exists('database','name');
        $db_host = $cfg->val('database','host')        if $cfg->exists('database','host');
        $db_port = $cfg->val('database','port')        if $cfg->exists('database','port');
        $db_user = $cfg->val('database','user')        if $cfg->exists('database','user');
        $db_pass = $cfg->val('database','password')    if $cfg->exists('database','password');
        $DSN = $cfg->val('database','dsn')             if $cfg->exists('database','dsn');
        $logfile = $cfg->val('general','logfile')      if $cfg->exists('general','logfile');
        $port = $cfg->val('general','port')            if $cfg->exists('general','port');
    }

    # Then we check arguments from the constructor
    GetOptionsFromArray( @args,'dbname:s'      => $db_name,'dbhost:s'      => $db_host,'dbport:i'      => $db_port,'dbuser:s'      => $db_user,'dbpass:s'      => $db_pass,'dsn:s'         => $DSN,'logfile:s'     => $logfile,'port:i'        => $port,'help|?'        => sub { pod2usage( -input => pod_where( {-inc => 1},__PACKAGE__),-exitval => 1 ); },'man'           => sub { pod2usage( -input => pod_where( {-inc => 1},-exitval => 2,-verbose => 2 ); },);

    # Finally,we fall back to hard-coded defaults
    $db_name = 'pocketmud'  if !defined $db_name and !defined $DSN;
    $db_host = 'localhost'  if !defined $db_host and !defined $DSN;
    $db_port = 5432         if !defined $db_port and !defined $DSN;
    $db_user = 'quixadhal'  if !defined $db_user;
    $db_pass = 'password'   if !defined $db_pass;
    $logfile = '/home/quixadhal/PocketMUD/debug-server.log' if !defined $logfile;
    $port    = 4444         if !defined $port;

    $DSN = "DBI:Pg:dbname=$db_name;host=$db_host;port=$db_port;sslmode=prefer;options=--autocommit=on" if !defined $DSN and defined $db_name and defined $db_host and defined $db_port;

    die "Either a valid DSN or a valid database name,host,and port MUST exist in configuration data" if !defined $DSN;
    die "A valid database username MUST exist in configuration data" if !defined $db_user;
    die "A valid database password MUST exist in configuration data" if !defined $db_pass;
    die "A valid logfile MUST be defined in configuration data" if !defined $logfile;
    die "A valid port MUST be defined in configuration data" if !defined $port;


    my $self = {
        DB_NAME => $db_name,DB_HOST => $db_host,DB_PORT => $db_port,DB_USER => $db_user,DB_PASS => $db_pass,DSN     => $DSN,LOGFILE => $logfile,PORT    => $port,};

    bless $self,$class;
    print Dumper($self);
    return $self;
}

sub dsn {
    my $self = shift;
    if ( @_ ) {
        $self->{DSN} = shift;
    }
    return $self->{DSN};
}

sub db_user {
    my $self = shift;
    if ( @_ ) {
        $self->{DB_USER} = shift;
    }
    return $self->{DB_USER};
}

sub db_pass {
    my $self = shift;
    if ( @_ ) {
        $self->{DB_PASS} = shift;
    }
    return $self->{DB_PASS};
}

sub logfile {
    my $self = shift;
    if ( @_ ) {
        $self->{LOGFILE} = shift;
    }
    return $self->{LOGFILE};
}

sub port {
    my $self = shift;
    if ( @_ ) {
        $self->{PORT} = shift;
    }
    return $self->{PORT};
}

1;

解决方法

伙计,我真的在寻找这个挑战……

我偷看了Pod :: Usage的代码,看看发生了什么. Pod :: Usage直接使用perldoc命令,因此看起来perldoc和pod2usage都会以相同的方式打印.事实上,在我的系统上,perldoc和pod2usage默认或多或少默认为80列.我不知道为什么它在你的系统上有所不同.

有一个例外:

如果设置-noperldoc参数,它将使用Pod :: Text进行格式化,Pod :: Text有一个选项-width =>创建新的Pod :: Text对象时的$width.

我以为我可以将一个未记录的-width参数传递给pod2usage,它会被传递给创建的$parser对象.该对象是Pod :: Usage对象,但Pod :: Usage是Pod :: Text的子类.

没有骰子.

选项作为单独的USAGE_OPT选项的一部分传递,因此未正确设置$opt_width. Pod :: Text没有功能接口,因此width与特定的$parser对象相关联,而不是与包一般相关联.您不能设置$Pod :: Text :: width并覆盖默认的76值.默认情况下,这在程序中是硬编码的.

有一种方法可以使用Pod :: Text,找到一种获取终端宽度的方法,将其传递给Pod :: Text对象,然后使用该对象调用源文件中的parse_from_file方法.

如果终端宽度为130个字符,那么你可以看到你的POD输出为130个字符宽,这将是很多工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读