[英]How to pipe in a string to a Raku program?
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
中編寫簽名以便它捕獲管道輸入的字符串?
簡而言之:你目前不能。
我認為https://docs.raku.org/language/variables#$*ARGFILES以迂回的方式講述了原因。
我看到了兩種解決方法:
使第一個位置可選,沒有默認值,稍后檢查定義性
sub MAIN (Str $some-text?, Bool :$verbose) {
say "Your text:" if $verbose;
say $some-text // $*IN.slurp;
}
在執行MAIN
之前獲取$*IN
的內容,並將其用作默認值:
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.