Please find attached a patch to implement requested functionality.
Passes split-simple.t tests and includes a patch that updates those
tests and adds one more that verifies correct performance with a return
limit count.
Index: t/spec/S32-str/split-simple.t
===================================================================
--- t/spec/S32-str/split-simple.t (revision 26002)
+++ t/spec/S32-str/split-simple.t (working copy)
@@ -2,7 +2,7 @@
use Test;
# L<S29/Str/"=item split">
-plan 45;
+plan 46;
=begin description
@@ -83,12 +83,13 @@
# split should return capture
my @split = 'abc def ghi'.split(/(\s+)/);
-#?rakudo todo "split should return captures"
-#?DOES 3
-{
- ok @split.elems == 5, q{split returns captured delimiter} ;
- ok @split[1] eq ' ', q{split captured single space};
- ok @split[3] eq ' ', q{split captured multiple spaces};
-}
+ok @split.elems == 5, q{split returns captured delimiter} ;
+ok @split[1] eq ' ', q{split captured single space};
+ok @split[3] eq ' ', q{split captured multiple spaces};
+...@split = 'abc::def::ghi'.split(/(\:)/, 5);
+ok @split.elems == 5 and
+ @split[3] eq 'def' and
+ @split[4] eq ':',
+ q{split with capture obeyed limit};
# vim: ft=perl6
diff --git a/src/setting/Any-str.pm b/src/setting/Any-str.pm
index 27c2080..85e970a 100644
--- a/src/setting/Any-str.pm
+++ b/src/setting/Any-str.pm
@@ -54,9 +54,25 @@ class Any is also {
my $s = ~self;
my $l = $limit ~~ Whatever ?? Inf !! $limit;
my $keep = '';
+
return gather {
while $l > 1 && $s ~~ $delimiter {
take $keep ~ $s.substr(0, $/.from);
+ $l--;
+
+ # match objects too tied to underlying strings so copy ...
+ my @mat_cap = @().map: { substr($_, 0) };
+ my $mat_cap_n = $l min @mat_cap.elems;
+ if ($mat_cap_n) {
+ if $mat_cap_n == @mat_cap {
+ take @mat_cap
+ }
+ else {
+ take @mat_cap[ 0 .. ($mat_cap_n -1) ]
+ }
+ $l -= $mat_cap_n
+ }
+
if $/.from == $/.to {
$keep = $s.substr($/.to, 1);
$s.=substr($/.to + 1);
@@ -64,7 +80,6 @@ class Any is also {
$keep = '';
$s.=substr($/.to)
}
- $l--;
}
take $keep ~ $s if $l > 0;
}