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;
Variables§
$*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 a 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.