Change 11475 by jhi@alpha on 2001/07/29 16:28:45
Subject: [PATCH split()] split()'s unused captures should be undef, not ''
From: "Jeff 'japhy/Marillion' Pinyan" <[EMAIL PROTECTED]>
Date: Fri, 27 Jul 2001 14:00:37 -0400 (EDT)
Message-ID: <[EMAIL PROTECTED]>
Affected files ...
... //depot/perl/pod/perlfunc.pod#251 edit
... //depot/perl/pp.c#289 edit
... //depot/perl/t/op/split.t#25 edit
Differences ...
==== //depot/perl/pod/perlfunc.pod#251 (text) ====
Index: perl/pod/perlfunc.pod
--- perl/pod/perlfunc.pod.~1~ Sun Jul 29 10:45:05 2001
+++ perl/pod/perlfunc.pod Sun Jul 29 10:45:05 2001
@@ -4481,6 +4481,10 @@
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 @@
#...
}
+As with regular pattern matching, any capturing parentheses that are not
+matched in a C<split()> will be set to C<undef> when returned:
+
+ @fields = split /(A)|B/, "1A2B3";
+ # @fields is (1, 'A', 2, undef, 3)
=item sprintf FORMAT, LIST
==== //depot/perl/pp.c#289 (text) ====
Index: perl/pp.c
--- perl/pp.c.~1~ Sun Jul 29 10:45:05 2001
+++ perl/pp.c Sun Jul 29 10:45:05 2001
@@ -4228,12 +4228,16 @@
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)
==== //depot/perl/t/op/split.t#25 (xtext) ====
Index: perl/t/op/split.t
--- perl/t/op/split.t.~1~ Sun Jul 29 10:45:05 2001
+++ perl/t/op/split.t Sun Jul 29 10:45:05 2001
@@ -5,7 +5,7 @@
@INC = '../lib';
}
-print "1..45\n";
+print "1..46\n";
$FS = ':';
@@ -254,3 +254,14 @@
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";
+}
End of Patch.