Re: 'split': differences between Perl5 and Perl6

2016-02-27 Thread James E Keenan

On 02/27/2016 08:38 PM, Brandon Allbery wrote:




[...] is what used to be (?:...), and <[...]> is what used to be [...].
Regexes have changed a *lot*, and you will really need to learn how they
work now; just hoping that things work just like perl 5 will not work.



My apologies for being a Perl6 beginner.


'split': differences between Perl5 and Perl6

2016-02-27 Thread James E Keenan
I am trying to understand the differences in the way the 'split' 
function works between Perl5 and Perl6.


Consider this string:

#
$str = q|This is a string to be split|;
#

Let's suppose I wish to split this string on the multi-character 
delimiter string 'tri'.  The results are the same in both languages.


#
# Case 1
$ perl -e 'my ($str, @rv);$str = q|This is a string to be split|; @rv = 
split(q|tri|, $str); print "<$_>" for @rv; print "\n";'


#
# Case 2
$ perl6 -e 'my ($str, @rv);$str = q|This is a string to be split|; @rv = 
split(q|tri|, $str); print "<$_>" for @rv; print "\n";'


#

Now let's suppose that in Perl5 I wish to split the string on a pattern 
which is the character class /[tri]/.  I get:


#
# Case 3
$ perl -e 'my ($str, @rv);$str = q|This is a string to be split|; @rv = 
split(/[tri]/, $str); print "<$_>" for @rv; print "\n";'

<><>
#

The result is a list of strings which do not contain any of 't', 'r' or 
'i'.  Where two of the delimiters occurred consecutively in the original 
string, I get an empty string -- except that empty strings at the end of 
the list are dropped.


Now let's run the same code in Perl6:

#
# Case 4
$ perl6 -e 'my ($str, @rv);$str = q|This is a string to be split|; @rv = 
split(/[tri]/, $str); print "<$_>" for @rv; print "\n";'


#

I'm surprised to get exactly the same output I got in both languages 
when my delimiter was the multi-character string 'tri'.  The '[' and ']' 
characters do not seem to indicate "character class" at all.  It's as if 
'/[...]/' magically turns into 'q|...|'.  What am I not grasping here?


One more case:  When, in Perl6, I surround the brackets with angle 
brackets, I get somewhat more expected behavior:


#
# Case 5
$ perl6 -e 'my ($str, @rv);$str = q|This is a string to be split|; @rv = 
split(/<[tri]>/, $str); print "<$_>" for @rv; print "\n";'

<><><><>
#

I get something very similar to Case 3, which was written in Perl5, 
viz., a list of strings which do not contain any of 't', 'r' or 'i'. 
Where two of the delimiters occurred consecutively in the original 
string, I get an empty string -- including at the end of the original 
string.  So, does that mean that, in Perl6, to split a string on a 
character class, I have to always indicate (via the angle brackets) that 
the character class is a list?


Thank you very much.
Jim Keenan


Perl 6 memoization: factorial in rosettacode.org

2016-02-27 Thread Tom Browder
On rosettacode.org there is an example of memoization for calculating
factorials in Perl 6 (contributed by Larry Wall):

  constant fact = 1, |[\*] 1..*;
  say fact[5];

How does one code that so that results are able to be reused by
multiple programs?

Thanks.

Cheers!

-Tom