class IO::ArgFiles
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.