Here's how I ended up handling input arg validation, with meaningful error
messages, as part of a Perl Weekly Challenge a couple years ago. It looks
almost the same as Luca's original, except mine uses "die" instead of
"warn", which means it won't attempt to continue once it encounters a bad
arg.

sub MAIN(Int $line_to_start is copy,    #= First line to print
         Int $end_line                  #= Last line to print
            where { $_ >= $line_to_start
                or die "end_line cannot be less than line_to_start" },

         *@input_file       #= File(s) to read from. Also reads STDIN.
            where { .all.IO.f
                or die "Not a file path:\n  { .grep({! .IO.f}).join: "\n  "
} "}
    ) {
    .say if --$line_to_start < 1
        for IO::CatHandle.new(@input_file, $*IN).lines($end_line)
    # Alternative would be to use .lines.kv to get line num with line
    ...

I'm starting to think Luca's found a regression, since using the explicit
variable name instead of the topic fixes the issue. That seems wrong.

-y


On Thu, Apr 14, 2022 at 8:26 PM William Michels via perl6-users <
perl6-us...@perl.org> wrote:

> Works (𝐑𝐚𝐤𝐮𝐝𝐨™ v2021.06):
>
> admin@mbook:~$ raku Luca_Ferrari2.p6
> Usage:
>   Luca_Ferrari2.p6 [--dir=<Str where { ... }>]
> admin@mbook:~$ raku Luca_Ferrari2.p6 --dir=foo
> foo
>
> But...warning "Specify the directory [$dir]" isn't printing when
> `--dir=foo` is omitted.
>
> HTH, Bill.
>
> On Tue, Apr 12, 2022 at 1:23 AM Luca Ferrari <fluca1...@gmail.com> wrote:
>
>> On Tue, Apr 12, 2022 at 10:15 AM Luca Ferrari <fluca1...@gmail.com>
>> wrote:
>> >
>> > Hello all,
>> > given this simple program:
>> >
>> > sub MAIN( Str :$dir where { .so && .IO.d // warn "Specify the
>> > directory [$dir]" } ) {
>> >     say $dir;
>> > }
>> >
>>
>> Shame on me: it works if I omit the topic and substitute it with the
>> explicit variable, thus:
>>
>> sub MAIN( Str :$dir where { $dir.so && $dir.IO.d // warn "Specify the
>> directory [$dir]" } ) {
>>     say $dir;
>> }
>>
>> The only thing that I find in the documentation at
>> <https://docs.raku.org/type/Signature#index-entry-where_clause> is:
>> "The code in where clauses has some limitations: anything that
>> produces side-effects (e.g., printing output, pulling from an
>> iterator, or increasing a state variable) is not supported and may
>> produce surprising results if used. Also, the code of the where clause
>> may run more than once for a single typecheck in some
>> implementations."
>>
>> Is there a better approach to spurting warning messages when a
>> parameter is not correct (without dealing with USAGE() and friends)?
>>
>> Thanks,
>> Luca
>>
>

Reply via email to