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

287 views Asked by At

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

1

There are 1 answers

1
smls On BEST ANSWER

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().