Skip to content
James E Keenan edited this page Feb 14, 2016 · 5 revisions
my ($str, @rv);
$str = 'This is a string to be split';
say q|$str:                     |, $str;
say '';
say "split on single-character delimiter found in string:";
@rv = split('t', $str); print "<$_>" for @rv; print "\n";
say '';
say "split on single-character delimiter found in string; method notation:";
@rv = $str.split('t'); print "<$_>" for @rv; print "\n";
say '';
say "split on multiple-character delimiter found in string:";
@rv = split('tr', $str); print "<$_>" for @rv; print "\n";
say '';
say "split on single-character delimiter NOT found in string:";
@rv = split('x', $str); print "<$_>" for @rv; print "\n";
say '';
say "split on empty string:";
@rv = split('', $str); print "<$_>" for @rv; print "\n";
say '';
say "split on single-character delimiter found in string with limit on number of elements returned:";
@rv = split('t', $str, 2); print "<$_>" for @rv; print "\n";
say '';
say "split on any of a list of delimiters found in string; use < > to denote list:";
@rv = split(<t i>, $str); print "<$_>" for @rv; print "\n";
say '';
say "split on any of a list of delimiters found in string; use < > to denote list:";
@rv = split(<is g>, $str); print "<$_>" for @rv; print "\n";
say '';
say "split on a pattern:";
@rv = $str.split(/<[tri]>/); print "<$_>" for @rv; print "\n";

Output:

$ perl6 split.pl6
$str:                     This is a string to be split

split on single-character delimiter found in string:
<This is a s><ring ><o be spli><>

split on single-character delimiter found in string; method notation:
<This is a s><ring ><o be spli><>

split on multiple-character delimiter found in string:
<This is a s><ing to be split>

split on single-character delimiter NOT found in string:
<This is a string to be split>

split on empty string:
<><T><h><i><s>< ><i><s>< ><a>< ><s><t><r><i><n><g>< ><t><o>< ><b><e>< ><s><p><l><i><t><>

split on single-character delimiter found in string with limit on number of elements returned:
<This is a s><ring to be split>

split on any of a list of delimiters found in string; use < > to denote list:
<Th><s ><s a s><r><ng ><o be spl><><>

split on any of a list of delimiters found in string; use < > to denote list:
<Th>< >< a strin>< to be split>

split on a pattern:
<Th><s ><s a s><><><ng ><o be spl><><>

Note the following difference between Perl 5 and Perl 6. Take a simple program written the same way in each language.

my ($str, @rv);
$str = 'This is a string to be split';
@rv = split(/<[tri]>/, $str);
print "<$_>" for @rv; print "\n";
@rv = split(/[tri]/, $str);
print "<$_>" for @rv; print "\n";

Run it first in Perl 5:

perl split_char_class_delimiter.pl 
<This is a string to be split>
<Th><s ><s a s><><><ng ><o be spl>

Now run it in Perl 6:

$ perl6 split_char_class_delimiter.pl 
<Th><s ><s a s><><><ng ><o be spl><><>
<This is a s><ng to be split>

Explanation?

Optional Named Parameters

say "split on a pattern; :skip-empty:";
@rv = $str.split(/<[tri]>/, :skip-empty); print "<$_>" for @rv; print "\n";
say '';
say "split on the empty string; :skip-empty:";
@rv = $str.split('', :skip-empty); print "<$_>" for @rv; print "\n";
say '';
say "split on single-character delimiter found in string; also return the delimiter via ':v':";
@rv = split('t', $str, :v); print "<$_>" for @rv; print "\n";
say '';
say "split on a pattern; also return the delimiter via ':v':";
@rv = $str.split(/<[tri]>/, :v); print "<$_>" for @rv; print "\n";
say '';
say "split on any of a list of delimiters found in string; use < > to denote list";
say "also return index of delimiter via ':k':";
@rv = split(<t i>, $str, :k); print "<$_>" for @rv; print "\n";
say '';
say "split on any of a list of delimiters found in string; use < > to denote list";
say "also return both index of delimiter and delimiter via ':kv':";
@rv = split(<t i>, $str, :kv); print "<$_>" for @rv; print "\n";
say '';
say "split on any of a list of delimiters found in string; use < > to denote list";
say "also return both index of delimiter and delimiter as a Pair via ':p':";
@rv = split(<t i>, $str, :p); print "<$_>" for @rv; print "\n";

Output:

split on a pattern; :skip-empty:
<Th><s ><s a s><ng ><o be spl>

split on the empty string; :skip-empty:
<T><h><i><s>< ><i><s>< ><a>< ><s><t><r><i><n><g>< ><t><o>< ><b><e>< ><s><p><l><i><t>

split on single-character delimiter found in string; also return the delimiter via ':v':
<This is a s><t><ring ><t><o be spli><t><>

split on a pattern; also return the delimiter via ':v':
<Th><i><s ><i><s a s><t><><r><><i><ng ><t><o be spl><i><><t><>

split on any of a list of delimiters found in string; use < > to denote list
also return index of delimiter via ':k':
<Th><1><s ><1><s a s><0><r><1><ng ><0><o be spl><1><><0><>

split on any of a list of delimiters found in string; use < > to denote list
also return both index of delimiter and delimiter via ':kv':
<Th><1><i><s ><1><i><s a s><0><t><r><1><i><ng ><0><t><o be spl><1><i><><0><t><>

split on any of a list of delimiters found in string; use < > to denote list
also return both index of delimiter and delimiter as a Pair via ':p':
<Th><1	i><s ><1	i><s a s><0	t><r><1	i><ng ><0	t><o be spl><1	i><><0	t><>
Clone this wiki locally