class IO::ArgFiles 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 $argfiles = IO::ArgFiles.new(@*ARGS); .say for $argfiles.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 $argfiles = IO::CatHandle.new(@*ARGS); .say for $argfiles.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 $*ARGFILES.lines; # or while ! $*ARGFILES.eof { say $*ARGFILES.get; } # or say $*ARGFILES.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 () { .say for $*ARGFILES.lines; }
which can be used as cat *.raku | raku argfiles-main.raku
, for instance, is totally equivalent to:
sub MAIN () { .say for $*IN.lines; }
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 $*ARGFILES.handles -> $fh { say $fh; }
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.