簡體   English   中英

如何將字符串中的 pipe 轉換為 Raku 程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM