Iterate over contents of files specified on command line
is IO::CatHandle
This class exists for backwards compatibility reasons and provides no additional methods to IO::CatHandle
, so it can be used in the same way as it, for instance, in this way:
my = IO::ArgFiles.new();.say for .lines;
If invoked with raku io-argfiles.raku *.raku
it will print the contents of all the files with that extension in the directory. However, that is totally equivalent to:
my = IO::CatHandle.new();.say for .lines;
$*ARGFILES
This class is the magic behind the $*ARGFILES
variable, which provides a way to iterate over files passed in to the program on the command line (i.e. elements of @*ARGS
). Thus the examples above can be simplified like so:
.say for .lines;# orwhile ! .eof# orsay .slurp;
Save one of the variations above in a file, say argfiles.raku
. Then create another file (named, say sonnet18.txt
with the contents:
Shall I compare thee to a summer's day?
Running the command
$ raku argfiles.raku sonnet18.txt
will then give the output
Shall I compare thee to a summer's day?
As of 6.d language, $*ARGFILES
inside sub MAIN
is always set to $*IN
, even when @*ARGS
is not empty. That means that
sub MAIN ()
which can be used as cat *.raku | raku argfiles-main.raku
, for instance, is totally equivalent to:
sub MAIN ()
and, in fact, can't be used to process the arguments in the command line, since, in this case, it would result in an usage error.
Bear in mind that the object $*ARGFILES
is going to contain a handle for every argument in a command line, even if that argument is not a valid file. You can retrieve them via the .handles
method.
for .handles ->
That code will fail if any of the arguments is not the valid name of a file. You will have to deal with that case at another level, checking that @*ARGS
contains valid file names, for instance.