You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Raku程序的MAIN签名以捕获管道输入的字符串?

解决Raku MAIN捕获管道输入的问题

你的原代码中,尽管为$some-text设置了$*IN.slurp作为默认值,但实际运行时未能正确捕获管道传入的字符串。这是因为MAIN参数默认值的求值逻辑在部分场景下无法可靠读取标准输入。以下是两种可行的签名写法:

方案1:使用可选位置参数,函数体内回退读取标准输入

将$some-text设为可选参数(末尾加?),在函数体内判断是否传入位置参数,未传入则读取$*IN:

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

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

运行echo "Hello World" | ./foo.raku --verbose时,$some-text为Nil,代码会自动读取管道输入的内容。

方案2:使用多候选MAIN(multi MAIN)

定义两个MAIN候选,分别处理"传入位置参数"和"仅传入命名参数"的场景:

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

multi MAIN (Str $some-text, Bool :$verbose) {
    say "Your text:" if $verbose;
    say $some-text;
}

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

当没有提供位置参数时,会自动匹配第二个候选,读取标准输入的内容。

内容的提问来源于stack exchange,提问作者Jim Bollinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:35:22