This is a poetic quine (or quine-maker) in perl5.
open myself, $0 and print <myself>;
The same thing in perl6 would be:
my $self = open $*PROGRAM_NAME; for =$self { say }
or
my $self = open $*PROGRAM_NAME; say for =$self;
or
my $self = slurp $*PROGRAM_NAME; print $self;
or even
$*PROGRAM_NAME.slurp.map:{ print };
The last example must not be
$*PROGRAM_NAME.slurp.print;
You can check it out by running the code below;
##
$*PROGRAM_NAME.slurp.print
##
Will print:
##$*PROGRAM_NAME.slurp.print##
This is because print() (and say()) expects list context and slurp()
passes an array of chomped strings. When it comes to autoboxing, the
context-sensitivity of builtins may bite you like this.
With that understood, I would welcome if we have a version of slurp()
which unconditionally returns a scalar. Say swallow()? Of course it
is as easy to implement as the following;
sub swallow($file){ my $content = slurp $file; return $content };
But like say(), I would love to have something like that as a builtin.
Or am I getting too much ruby recently?
Dan the Perl6 Addict
> With that understood, I would welcome if we have a version of slurp()
> which unconditionally returns a scalar.
That'd be:
~slurp $file;
:-)
Damian
Very clever. But still not good enough when it comes to autoboxing.
{ ~slurp }($*PROGRAM_NAME).print
and even
(~slurp $*PROGRAM_NAME).print
works as expected but since "~slurp $file" is really ~(slurp $file),
$*PROGRAM_NAME.~slurp.print
does not. The problem of ~stringify, ?boolify, and +numify is that
they are infix operators so it goes the opposite direction.
Oh, while I was testing all these on pugs, I came across this.
##
say $*PROGRAM_NAME.slurp.elems;
##
This says 1 but
##
my @lines = $*PROGRAM_NAME.slurp; say @lines.elems;
##
says 3. This I am confused.
Dan the Perl6 Golfer on the Bunker
s/infix/prefix/
Sorry.
>> ~slurp $file;
>
> Very clever. But still not good enough when it comes to autoboxing.
>
> { ~slurp }($*PROGRAM_NAME).print
>
> and even
>
> (~slurp $*PROGRAM_NAME).print
>
> works as expected but since "~slurp $file" is really ~(slurp $file),
>
> $*PROGRAM_NAME.~slurp.print
>
> does not.
You want:
(~$*PROGRAM_NAME.slurp).print;
Or:
$*PROGRAM_NAME.slurp(sep=>undef).print;
The problem of ~stringify, ?boolify, and +numify is that
> they are infix operators so it goes the opposite direction.
>
> Oh, while I was testing all these on pugs, I came across this.
>
> ##
> say $*PROGRAM_NAME.slurp.elems;
> ##
That call to .slurp is in scalar context, since the result is immediately used
as an object.
> This says 1 but
>
> ##
> my @lines = $*PROGRAM_NAME.slurp; say @lines.elems;
> ##
>
> says 3.
That .slurp is in list context.
Damian