This behaviour looks wrong to me:

m...@edward:~/perl/6$ cat ap1
#!/home/msl/bin/perl6

my @a = <blue light hazard>;
my $p = @a.perl;
say "\...@a: {...@a.elems} elements: $p";
say '@a[0]: ', @a[0];

my @b = eval $p;
say "\...@b: {...@b.elems} elements: $p";
say '@b[0]: ',    @b[0];
say '@b[0][0]: ', @b[0][0];

m...@edward:~/perl/6$ ./ap1
@a: 3 elements: ["blue", "light", "hazard"]
@a[0]: blue
@b: 1 elements: ["blue", "light", "hazard"]
@b[0]: blue light hazard
@b[0][0]: blue
m...@edward:~/perl/6$ perl6 -v
This is Rakudo Perl 6, revision 34744 built on parrot 0.8.2-devel
for i486-linux-gnu-thread-multi.

Copyright 2006-2008, The Perl Foundation.

m...@edward:~/perl/6$


Because C<@a.perl> returns a string surrounded in square brackets, rather
than round brackets, C<eval> produces a list containing a single element:
we get one extra, unwanted level of indirection.

If C<@a.perl> were to return a string surrounded in round brackets, this
problem would be solved:


m...@edward:~/perl/6$ cat ap2
#!/home/msl/bin/perl6

my $p = '("blue", "light", "hazard")';

my @c = eval $p;
say "\...@c: {...@c.elems} elements: ", @c.perl;
say '@c[0]: ', @c[0];

my $c = eval $p;
say "\$c: {$c.elems} elements: ", $c.perl;
say '$c[0]: ', $c[0];

m...@edward:~/perl/6$ ./ap2
@c: 3 elements: ["blue", "light", "hazard"]
@c[0]: blue
$c: 3 elements: ["blue", "light", "hazard"]
$c[0]: blue
m...@edward:~/perl/6$


Is Rakudo's behaviour correct here?

Markus

Reply via email to