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;
}
Возьмите содержимое $*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;
}
Первое решение помогло! Спасибо. Странно то, что когда я удаляю флаг :$verbose (из моего исходного кода), программа работает, как и ожидалось, как с аргументом, так и с переданным текстом.