From: Jeff Pinyan Date: Fri, 27 Jul 2001 14:00:37 +0000 (-0400) Subject: split()'s unused captures should be undef, not '' X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6de678708ca27d8ff9604030551fb53b27f5c5be;p=p5sagit%2Fp5-mst-13.2.git split()'s unused captures should be undef, not '' Message-ID: p4raw-id: //depot/perl@11475 --- diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod index 3f86c6a..4a76999 100644 --- a/pod/perlfunc.pod +++ b/pod/perlfunc.pod @@ -4481,6 +4481,10 @@ characters at each point it matches that way. For example: produces the output 'h:i:t:h:e:r:e'. +Using the empty pattern C specifically matches the null string, and is +not be confused with the use of C to mean "the last successful pattern +match". + Empty leading (or trailing) fields are produced when there positive width matches at the beginning (or end) of the string; a zero-width match at the beginning (or end) of the string does not produce an empty field. For @@ -4540,6 +4544,11 @@ Example: #... } +As with regular pattern matching, any capturing parentheses that are not +matched in a C will be set to C when returned: + + @fields = split /(A)|B/, "1A2B3"; + # @fields is (1, 'A', 2, undef, 3) =item sprintf FORMAT, LIST diff --git a/pp.c b/pp.c index 51e10de..658a890 100644 --- a/pp.c +++ b/pp.c @@ -4228,12 +4228,16 @@ PP(pp_split) for (i = 1; i <= rx->nparens; i++) { s = rx->startp[i] + orig; m = rx->endp[i] + orig; - if (m && s) { + + /* japhy (07/27/01) -- the (m && s) test doesn't catch + parens that didn't match -- they should be set to + undef, not the empty string */ + if (m >= orig && s >= orig) { dstr = NEWSV(33, m-s); sv_setpvn(dstr, s, m-s); } else - dstr = NEWSV(33, 0); + dstr = &PL_sv_undef; /* undef, not "" */ if (make_mortal) sv_2mortal(dstr); if (do_utf8) diff --git a/t/op/split.t b/t/op/split.t index 170dfe8..f9c3bb9 100755 --- a/t/op/split.t +++ b/t/op/split.t @@ -5,7 +5,7 @@ BEGIN { @INC = '../lib'; } -print "1..45\n"; +print "1..46\n"; $FS = ':'; @@ -254,3 +254,14 @@ print "ok 32\n"; print "not " unless $r eq "he:o cruel world"; print "ok 45\n"; } + + +{ + # split /(A)|B/, "1B2" should return (1, undef, 2) + my @x = split /(A)|B/, "1B2"; + print "not " unless + $x[0] eq '1' and + (not defined $x[1]) and + $x[2] eq '2'; + print "ok 46\n"; +}