Here is the new patch for split on a regex. Testing it with:

say "theXbiggestXbangXforXtheXbuck".split(/X/).perl;
say "ab1cd12ef123gh".split(/\d+/).perl;
say "<frag>char</frag><tag>soup</tag>".split(/\<\/?.*?\>/).perl;
We get the following output:

["the", "biggest", "bang", "for", "the", "buck"]
["ab", "cd", "ef", "gh"]
["", "char", "", "soup", ""]

I'll upload a test to pugs later.

On Thu, Sep 18, 2008 at 3:33 PM, Moritz Lenz
<[EMAIL PROTECTED]> wrote:
> Chris Davaz wrote:
>> Ok, here it is without the change to "split on a string", and the test
>> passes.
>
> Yes, but on my machine now t/spec/S04-statements/gather.t produces a
> segmentation fault. I'll have to investigate if that is related to your
> patch or not.
>
> Also split behaves a bit strangely here:
>
>  > say 'ab23d4f5'.split(/\d+/).perl
>  ["ab", "", "", "d", "f", ""]
>  > say 'ab23d4f5'.split(/\d/).perl
>  ["ab", "", "d", "f", ""]
>
> (There are a few other oddities like the behaviour with a zero-width
> match, but that's only a minor issue).
>
>> Please apply this one and in the meantime I will see how we can
>> get the method signature right for split on a strong + not break reverse.
>
> --
> Moritz Lenz
> http://moritz.faui2k3.org/ |  http://perl-6.de/
>
Index: src/classes/Str.pir
===================================================================
--- src/classes/Str.pir	(revision 31220)
+++ src/classes/Str.pir	(working copy)
@@ -76,6 +76,35 @@
     .return(retv)
 .end
 
+# split a string on a regex
+.sub 'split' :method :multi(_, 'Sub')
+    .param pmc regex 
+    .local pmc match
+    .local pmc tmpstr
+    .local pmc retv
+    .local int start_pos
+    .local int end_pos
+
+    $S0 = self
+    retv = new 'List'
+    start_pos = 0
+
+  loop:
+    match = regex($S0, 'continue' => start_pos)
+    end_pos = match.'from'()
+    end_pos -= start_pos
+    tmpstr = new 'Perl6Str'
+    $S1 = substr $S0, start_pos, end_pos
+    tmpstr = $S1
+    retv.'push'(tmpstr)
+    unless match goto done
+    start_pos = match.'to'()
+    goto loop
+
+  done:
+    .return(retv)
+.end
+
 .sub lc :method
     .local string tmps
     .local pmc retv

Reply via email to