zoukankan      html  css  js  c++  java
  • perl 打印简单的help文档

    PrintHelp.pm

    #!/usr/bin/perl
    
    package PrintHelp;
    require Exporter;
    
    use v5.26;
    use strict;
    use utf8;
    use autodie;
    use warnings;
    use Encode qw(decode encode);
    use experimental 'smartmatch'; # 忽略智能匹配的错误警告
    use Data::Dumper;
    
    sub new {
       my $class = shift;
       my $self = {
          usages   => shift,
          options  => shift,
       };
       bless $self, $class;
    
       my $help = "";
       $help .= $self->setUsages();
       $help .= $self->setOptions();
       say encode('utf-8', $help);
       return $self;
    }
    
    # 获取options中命令的最大长度
    sub getMaxLen {
       my( $self ) = @_;
       my $maxLen = 0;
       for(keys %{$self->{options}}) {
          $maxLen = length($_) if(length($_) > $maxLen);
       }
       return $maxLen;
    }
    
    # 设置Usages
    sub setUsages {
       my( $self ) = @_;
       my $help = "";
       my $usages = $self->{usages};
       if(defined($usages)){
          my $usagesLen = @{$usages};
          for(my $i=0; $i < $usagesLen; $i++){
             $help .= ($i == 0) ? "Usage: " : " " x 7;
             $help .= "$usages->[$i]
    ";
          }
          $help .= "
    ";
       }
       return $help;
    }
    
    # 设置options
    sub setOptions {
       my( $self ) = @_;
       my $help = "";
       my $opts = $self->{options};
       if(defined($opts)){
          my $maxLen = $self->getMaxLen();
          $help .= "Options:
    ";
          for(keys %{$opts}) {
            my $keyLen = length($_);
            $help .= "  ";
            $help .= "-$opts->{$_}{"alias"}, " if(defined($opts->{$_}{"alias"}));
            $help .= "--$_";
            $help .= " " x ($maxLen - $keyLen) if($keyLen < $maxLen);
            $help .= "	$opts->{$_}{"msg"}" if(defined($opts->{$_}{"msg"}));
            $help .= " (default: $opts->{$_}{"default"})" if(defined($opts->{$_}{"default"}));
            $help .= "
    ";
          };
       }
       return $help;
    }
    
    our @ISA = qw(Exporter); # 继承Exporter
    our @EXPORT_OK = qw(); #
    1;
    

    将模块和脚本放在同一目录下

    main.pl

    #!/usr/bin/perl -I./
    
    use PrintHelp;
    
      PrintHelp->new([
          "atree [dir=./] [options]",
          "atree ./lib",
          "atree ./lib --depath 1",
          "or",
          "atree ./lib -d 1",
          "atree -i ~/.atree -d 3"
        ],
        {
      	ignores => {
          msg => "无视目录配置文件路径.",
          alias => "i",
          default => "./atree"
      	},
      	depath => {
          msg => "查询目录深度.",
          alias => "d",
          default => '0 无限.'
      	},
        help => {
          msg => "帮助文档.",
          alias => "h",
        }
      });
    
    λ perl main.pl
    Usage: atree [dir=./] [options]
           atree ./lib
           atree ./lib --depath 1
           or
           atree ./lib -d 1
           atree -i ~/.atree -d 3
    
    Options:
      -d, --depath  查询目录深度. (default: 0 无限.)
      -i, --ignores 无视目录配置文件路径. (default: ./atree)
      -h, --help    帮助文档.
    
  • 相关阅读:
    目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)
    目标检测评价标准(mAP, 精准度(Precision), 召回率(Recall), 准确率(Accuracy),交除并(IoU))
    JavaScript中继承的多种方式和优缺点
    使用Vue封装暂无数据占位图组件
    Vue组件间通信方式到底有几种
    通俗易懂了解Vue中nextTick的内部实现原理
    从0开始编写webpack插件
    常用的webpack优化方法
    通俗易懂了解Vue内置组件keep-alive内部原理
    原生JS实现集合结构
  • 原文地址:https://www.cnblogs.com/ajanuw/p/12163785.html
Copyright © 2011-2022 走看看