我该如何将一个字符串输入到 Raku 程序中?

7

foo.raku:

#! /usr/bin/env raku
use v6.d;

sub MAIN (Str $some-text = $*IN.slurp, Bool :$verbose) {
    say "Your text:" if $verbose;
    say $some-text;
}          

当我运行它时

~% echo "Hello World" | ./foo.raku --verbose

我得到:
Your text:

如何编写MAIN中的签名以捕获管道传入的字符串?

1个回答

6
简而言之:目前你无法这样做。
我认为https://docs.raku.org/language/variables#$*ARGFILES以迂回的方式解释了原因。
我看到两种方法可以解决这个问题:
使第一个位置可选,但没有默认值,并稍后检查其是否定义。
sub MAIN (Str $some-text?, Bool :$verbose) {
    say "Your text:" if $verbose;
    say $some-text // $*IN.slurp;
}

抓取$*IN的内容MAIN被执行之前,并将其用作默认值:
my $default = $*IN.slurp;
sub MAIN (Str $some-text = $default, Bool :$verbose) {
    say "Your text:" if $verbose;
    say $some-text;
}

无论如何,如果脚本在没有被管道输入任何内容的情况下被调用,使用$*IN.slurp会有其缺点。它将等待用户自行输入而不发出提示,这可能被解释为挂起。因此,您可能希望添加一个检查,以便至少提供一些视觉反馈,使用https://docs.raku.org/routine/t#(IO::Handle)_method_t
say "Type input, then ^D" if $*IN.t;
my $default = $*IN.slurp;
sub MAIN (Str $some-text = $default, Bool :$verbose) {
    say "Your text:" if $verbose;
    say $some-text;
}

2
第一种解决方案奏效了!谢谢。奇怪的是,当我从原始代码中删除:$verbose标志时,程序按预期运行,无论是带参数还是通过管道输入文本。 - Jim Bollinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接