如何编写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
相关产品推荐
相关产品推荐

