> That's not right, is it?  Or I don't understand what perl 6 does with
> the capturing parens that's different from perl 5.  In perl 5 (and what
> I would expect from perl 6), @split would contain the following strings
> at the following array indices:
> 
...

Your concern seems to be with the added test and your issues with
respect to that test are valid.  A small change to the Any-str.pm/parrot
patch and a revised limit test are included with the updated attachments
that, I believe, address the noted problem(s).
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(/(\:)/, 3);
+ok  @split.elems == 5       and
+    @split[3] eq ':'        and
+    @split[4] eq 'def::ghi',
+    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..0346d4e 100644
--- a/src/setting/Any-str.pm
+++ b/src/setting/Any-str.pm
@@ -54,9 +54,23 @@ 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);
+
+                # 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) ]
+                    }
+                }
+
                 if $/.from == $/.to {
                     $keep = $s.substr($/.to, 1);
                     $s.=substr($/.to + 1);

Reply via email to