如何在Perl 6中解析和验证命令行参数?

时间:2015-04-17 15:59:33

标签: perl6 raku

在Perl 5中,我可以使用Getopt::Long通过一些验证来解析命令行参数(参见下面的http://perldoc.perl.org/Getopt/Long.html)。

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
GetOptions ("length=i" => \$length,    # numeric
            "file=s"   => \$data,      # string
            "verbose"  => \$verbose)   # flag
or die("Error in command line arguments\n");

say $length;
say $data;
say $verbose;

=i中的"length=i" --length为与=s相关联的值创建数字类型约束,"file=s"中的{{1}}创建类似的字符串类型约束。< / p>

如何在Perl 6中做类似的事情?

2 个答案:

答案 0 :(得分:15)

基本

该功能内置于Perl 6中。这相当于Perl 6中的Getopt::Long代码:

sub MAIN ( Str  :$file    = "file.dat"
         , Num  :$length  = Num(24)
         , Bool :$verbose = False
         )
{
    $file.say;
    $length.say;
    $verbose.say;
}

MAIN是一个特殊的子例程,它根据签名自动解析命令行参数。

StrNum提供字符串和数字类型约束。

Bool使$verbose成为二进制标志,如果不存在或False,则为--/verbose。 (/中的--/fooa common Unix command line syntax for setting an argument to False)。

:前置于子程序签名中的变量,使它们被命名(而不是位置)参数。

使用$variable =后跟默认值提供默认值。

别名

如果您想要单个字符或其他别名,可以使用:f(:$foo)语法。

sub MAIN ( Str  :f(:$file)    = "file.dat"
         , Num  :l(:$length)  = Num(24)
         , Bool :v(:$verbose) = False
         )
{
    $file.say;
    $length.say;
    $verbose.say;
}

:x(:$smth)--smth添加了其他别名,例如此示例中的短别名-x。多个别名和完全命名也是可用的,这是一个示例::foo(:x(:bar(:y(:$baz))))将为您提供--foo-x--bar-y和{{1如果其中任何一个传递给--baz

位置参数(和示例)

$baz也可以与位置参数一起使用。例如,这是Guess the number (from Rosetta Code)。它默认为最小值0和最大值100,但可以输入任何最小值和最大值。使用is copy允许在子例程中更改参数:

MAIN

用法消息

此外,如果您的命令行参数与#!/bin/env perl6 multi MAIN #= Guessing game (defaults: min=0 and max=100) { MAIN(0, 100) } multi MAIN ( $max ) #= Guessing game (min defaults to 0) { MAIN(0, $max) } multi MAIN #= Guessing game ( $min is copy #= minimum of range of numbers to guess , $max is copy #= maximum of range of numbers to guess ) { #swap min and max if min is lower if $min > $max { ($min, $max) = ($max, $min) } say "Think of a number between $min and $max and I'll guess it!"; while $min <= $max { my $guess = (($max + $min)/2).floor; given lc prompt "My guess is $guess. Is your number higher, lower or equal (or quit)? (h/l/e/q)" { when /^e/ { say "I knew it!"; exit } when /^h/ { $min = $guess + 1 } when /^l/ { $max = $guess } when /^q/ { say "quiting"; exit } default { say "WHAT!?!?!" } } } say "How can your number be both higher and lower than $max?!?!?"; } 签名不匹配,则默认情况下会收到有用的用法消息。请注意如何将以MAIN开头的子例程和参数注释巧妙地合并到此用法消息中:

#=

此处./guess --help Usage: ./guess -- Guessing game (defaults: min=0 and max=100) ./guess <max> -- Guessing game (min defaults to 0) ./guess <min> <max> -- Guessing game <min> minimum of range of numbers to guess <max> maximum of range of numbers to guess 不是定义的命令行参数,因此会触发此用法消息。

另见

另请参阅--help上的201020142018 Perl 6来临日历帖子,帖子Parsing command line arguments in Perl 6以及{{3} }。

答案 1 :(得分:2)

或者,perl6也有一个Getopt::Long。您的程序几乎无需修改即可在其中运行:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
get-options("length=i" => $length,    # numeric
            "file=s"   => $data,      # string
            "verbose"  => $verbose);  # flag

say $length;
say $data;
say $verbose;