gpt4 book ai didi

raku - 如何在 Raku(以前称为 Perl 6)中解析和验证命令行参数?

转载 作者:行者123 更新时间:2023-12-04 01:46:37 24 4
gpt4 key购买 nike

在 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"创建一个类似的字符串类型约束。

我如何在 Raku (née Perl 6) 中做类似的事情?

最佳答案

基本

该功能内置于 Raku(以前称为 Perl 6)中。这相当于您的 Getopt::Long Raku中的代码:

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--baz如果其中任何一个将传递给 $baz .

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

#!/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不是定义的命令行参数,因此触发此用法消息。

也可以看看

另见 2010 , 2014 , 和 2018 Perl 6 出现日历帖子 MAIN ,帖子 Parsing command line arguments in Perl 6 ,以及 section of Synopsis 6 about MAIN .

关于raku - 如何在 Raku(以前称为 Perl 6)中解析和验证命令行参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29704106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com