Search code examples
stdinargsraku

perl6 How to read from stdin and take command line args?


I need to pipe the result of "cat variousFiles" to a perl6 program while requiring the program to take different command line arguments. Perl6 seems to want to take the first argument as a file to be read. I can re-write my routines, but I want to use a pipe from shell. Is there a way to do it?

Here is my program named testStdInArgs.pl:

say @*ARGS;
for lines() {
    say "reading ==> ", $_;
}

I want to do (foo and bar are arguments):

cat logFile | perl6 testStdInArgs.pl foo bar

Here are the errors:

[foo bar]
Earlier failure:
 (HANDLED) Unable to open file 'foo'
  in block <unit> at stdInArgs.pl line 2

Final error:
 Type check failed in binding to $iter; expected Iterator but got Failure (Failure.new(exception...)
  in block <unit> at stdInArgs.pl line 2

Thank you very much


Solution

  • The lines function is a shortcut for $*ARGFILES.lines.
    $*ARGFILES is a magic file handle that represents a concatenation of the files specified as command-line arguments (@*ARGS), and falls back to stdin only if @*ARGS is empty.

    If you always want to read from stdin, use $*IN.lines:

    for $*IN.lines {
        say "reading ==> $_";
    }
    

    Alternatively, let your code modify @*ARGS to remove any command-line arguments that you don't want to be interpreted as filenames, and then use lines().