This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate from macperl:
[perl5.git] / t / op / subst.t
CommitLineData
e8ebd21b 1#!./perl -wT
d9d8d8de 2
a1a0e61e
TD
3BEGIN {
4 chdir 't' if -d 't';
20822f61 5 @INC = '../lib';
a1a0e61e
TD
6 require Config; import Config;
7}
344462d3 8
e8ebd21b 9require './test.pl';
8514a05a 10plan( tests => 108 );
d9d8d8de
LW
11
12$x = 'foo';
13$_ = "x";
14s/x/\$x/;
e8ebd21b 15ok( $_ eq '$x', ":$_: eq :\$x:" );
d9d8d8de
LW
16
17$_ = "x";
18s/x/$x/;
e8ebd21b 19ok( $_ eq 'foo', ":$_: eq :foo:" );
d9d8d8de
LW
20
21$_ = "x";
22s/x/\$x $x/;
e8ebd21b 23ok( $_ eq '$x foo', ":$_: eq :\$x foo:" );
d9d8d8de
LW
24
25$b = 'cd';
79072805 26($a = 'abcdef') =~ s<(b${b}e)>'\n$1';
e8ebd21b 27ok( $1 eq 'bcde' && $a eq 'a\n$1f', ":$1: eq :bcde: ; :$a: eq :a\\n\$1f:" );
d9d8d8de
LW
28
29$a = 'abacada';
e8ebd21b 30ok( ($a =~ s/a/x/g) == 4 && $a eq 'xbxcxdx' );
d9d8d8de 31
e8ebd21b 32ok( ($a =~ s/a/y/g) == 0 && $a eq 'xbxcxdx' );
d9d8d8de 33
e8ebd21b 34ok( ($a =~ s/b/y/g) == 1 && $a eq 'xyxcxdx' );
d9d8d8de
LW
35
36$_ = 'ABACADA';
e8ebd21b 37ok( /a/i && s///gi && $_ eq 'BCD' );
d9d8d8de
LW
38
39$_ = '\\' x 4;
e8ebd21b
RGS
40ok( length($_) == 4 );
41$snum = s/\\/\\\\/g;
42ok( $_ eq '\\' x 8 && $snum == 4 );
d9d8d8de
LW
43
44$_ = '\/' x 4;
e8ebd21b
RGS
45ok( length($_) == 8 );
46$snum = s/\//\/\//g;
47ok( $_ eq '\\//' x 4 && $snum == 4 );
48ok( length($_) == 12 );
d9d8d8de
LW
49
50$_ = 'aaaXXXXbbb';
51s/^a//;
e8ebd21b 52ok( $_ eq 'aaXXXXbbb' );
d9d8d8de
LW
53
54$_ = 'aaaXXXXbbb';
55s/a//;
e8ebd21b 56ok( $_ eq 'aaXXXXbbb' );
d9d8d8de
LW
57
58$_ = 'aaaXXXXbbb';
59s/^a/b/;
e8ebd21b 60ok( $_ eq 'baaXXXXbbb' );
d9d8d8de
LW
61
62$_ = 'aaaXXXXbbb';
63s/a/b/;
e8ebd21b 64ok( $_ eq 'baaXXXXbbb' );
d9d8d8de
LW
65
66$_ = 'aaaXXXXbbb';
67s/aa//;
e8ebd21b 68ok( $_ eq 'aXXXXbbb' );
d9d8d8de
LW
69
70$_ = 'aaaXXXXbbb';
71s/aa/b/;
e8ebd21b 72ok( $_ eq 'baXXXXbbb' );
d9d8d8de
LW
73
74$_ = 'aaaXXXXbbb';
75s/b$//;
e8ebd21b 76ok( $_ eq 'aaaXXXXbb' );
d9d8d8de
LW
77
78$_ = 'aaaXXXXbbb';
79s/b//;
e8ebd21b 80ok( $_ eq 'aaaXXXXbb' );
d9d8d8de
LW
81
82$_ = 'aaaXXXXbbb';
83s/bb//;
e8ebd21b 84ok( $_ eq 'aaaXXXXb' );
d9d8d8de
LW
85
86$_ = 'aaaXXXXbbb';
87s/aX/y/;
e8ebd21b 88ok( $_ eq 'aayXXXbbb' );
d9d8d8de
LW
89
90$_ = 'aaaXXXXbbb';
91s/Xb/z/;
e8ebd21b 92ok( $_ eq 'aaaXXXzbb' );
d9d8d8de
LW
93
94$_ = 'aaaXXXXbbb';
95s/aaX.*Xbb//;
e8ebd21b 96ok( $_ eq 'ab' );
d9d8d8de
LW
97
98$_ = 'aaaXXXXbbb';
99s/bb/x/;
e8ebd21b 100ok( $_ eq 'aaaXXXXxb' );
d9d8d8de
LW
101
102# now for some unoptimized versions of the same.
103
104$_ = 'aaaXXXXbbb';
105$x ne $x || s/^a//;
e8ebd21b 106ok( $_ eq 'aaXXXXbbb' );
d9d8d8de
LW
107
108$_ = 'aaaXXXXbbb';
109$x ne $x || s/a//;
e8ebd21b 110ok( $_ eq 'aaXXXXbbb' );
d9d8d8de
LW
111
112$_ = 'aaaXXXXbbb';
113$x ne $x || s/^a/b/;
e8ebd21b 114ok( $_ eq 'baaXXXXbbb' );
d9d8d8de
LW
115
116$_ = 'aaaXXXXbbb';
117$x ne $x || s/a/b/;
e8ebd21b 118ok( $_ eq 'baaXXXXbbb' );
d9d8d8de
LW
119
120$_ = 'aaaXXXXbbb';
121$x ne $x || s/aa//;
e8ebd21b 122ok( $_ eq 'aXXXXbbb' );
d9d8d8de
LW
123
124$_ = 'aaaXXXXbbb';
125$x ne $x || s/aa/b/;
e8ebd21b 126ok( $_ eq 'baXXXXbbb' );
d9d8d8de
LW
127
128$_ = 'aaaXXXXbbb';
129$x ne $x || s/b$//;
e8ebd21b 130ok( $_ eq 'aaaXXXXbb' );
d9d8d8de
LW
131
132$_ = 'aaaXXXXbbb';
133$x ne $x || s/b//;
e8ebd21b 134ok( $_ eq 'aaaXXXXbb' );
d9d8d8de
LW
135
136$_ = 'aaaXXXXbbb';
137$x ne $x || s/bb//;
e8ebd21b 138ok( $_ eq 'aaaXXXXb' );
d9d8d8de
LW
139
140$_ = 'aaaXXXXbbb';
141$x ne $x || s/aX/y/;
e8ebd21b 142ok( $_ eq 'aayXXXbbb' );
d9d8d8de
LW
143
144$_ = 'aaaXXXXbbb';
145$x ne $x || s/Xb/z/;
e8ebd21b 146ok( $_ eq 'aaaXXXzbb' );
d9d8d8de
LW
147
148$_ = 'aaaXXXXbbb';
149$x ne $x || s/aaX.*Xbb//;
e8ebd21b 150ok( $_ eq 'ab' );
d9d8d8de
LW
151
152$_ = 'aaaXXXXbbb';
153$x ne $x || s/bb/x/;
e8ebd21b 154ok( $_ eq 'aaaXXXXxb' );
d9d8d8de
LW
155
156$_ = 'abc123xyz';
c277df42 157s/(\d+)/$1*2/e; # yields 'abc246xyz'
e8ebd21b 158ok( $_ eq 'abc246xyz' );
c277df42 159s/(\d+)/sprintf("%5d",$1)/e; # yields 'abc 246xyz'
e8ebd21b 160ok( $_ eq 'abc 246xyz' );
c277df42 161s/(\w)/$1 x 2/eg; # yields 'aabbcc 224466xxyyzz'
e8ebd21b 162ok( $_ eq 'aabbcc 224466xxyyzz' );
d9d8d8de
LW
163
164$_ = "aaaaa";
e8ebd21b
RGS
165ok( y/a/b/ == 5 );
166ok( y/a/b/ == 0 );
167ok( y/b// == 5 );
168ok( y/b/c/s == 5 );
169ok( y/c// == 1 );
170ok( y/c//d == 1 );
171ok( $_ eq "" );
d9d8d8de
LW
172
173$_ = "Now is the %#*! time for all good men...";
e8ebd21b
RGS
174ok( ($x=(y/a-zA-Z //cd)) == 7 );
175ok( y/ / /s == 8 );
d9d8d8de 176
79072805
LW
177$_ = 'abcdefghijklmnopqrstuvwxyz0123456789';
178tr/a-z/A-Z/;
179
e8ebd21b 180ok( $_ eq 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' );
79072805
LW
181
182# same as tr/A-Z/a-z/;
e8ebd21b 183if (defined $Config{ebcdic} && $Config{ebcdic} eq 'define') { # EBCDIC.
6e68dac8 184 no utf8;
9d116dd7
JH
185 y[\301-\351][\201-\251];
186} else { # Ye Olde ASCII. Or something like it.
187 y[\101-\132][\141-\172];
188}
79072805 189
e8ebd21b 190ok( $_ eq 'abcdefghijklmnopqrstuvwxyz0123456789' );
79072805 191
e8ebd21b
RGS
192SKIP: {
193 skip("not ASCII",1) unless (ord("+") == ord(",") - 1
194 && ord(",") == ord("-") - 1
195 && ord("a") == ord("b") - 1
196 && ord("b") == ord("c") - 1);
197 $_ = '+,-';
198 tr/+--/a-c/;
199 ok( $_ eq 'abc' );
9d116dd7 200}
79072805
LW
201
202$_ = '+,-';
203tr/+\--/a\/c/;
e8ebd21b 204ok( $_ eq 'a,/' );
79072805
LW
205
206$_ = '+,-';
207tr/-+,/ab\-/;
e8ebd21b 208ok( $_ eq 'b-a' );
843b4603
TB
209
210
211# test recursive substitutions
212# code based on the recursive expansion of makefile variables
213
214my %MK = (
215 AAAAA => '$(B)', B=>'$(C)', C => 'D', # long->short
216 E => '$(F)', F=>'p $(G) q', G => 'HHHHH', # short->long
217 DIR => '$(UNDEFINEDNAME)/xxx',
218);
219sub var {
220 my($var,$level) = @_;
221 return "\$($var)" unless exists $MK{$var};
222 return exp_vars($MK{$var}, $level+1); # can recurse
223}
224sub exp_vars {
225 my($str,$level) = @_;
226 $str =~ s/\$\((\w+)\)/var($1, $level+1)/ge; # can recurse
227 #warn "exp_vars $level = '$str'\n";
228 $str;
229}
230
e8ebd21b
RGS
231ok( exp_vars('$(AAAAA)',0) eq 'D' );
232ok( exp_vars('$(E)',0) eq 'p HHHHH q' );
233ok( exp_vars('$(DIR)',0) eq '$(UNDEFINEDNAME)/xxx' );
234ok( exp_vars('foo $(DIR)/yyy bar',0) eq 'foo $(UNDEFINEDNAME)/xxx/yyy bar' );
3e3baf6d
TB
235
236$_ = "abcd";
c277df42 237s/(..)/$x = $1, m#.#/eg;
e8ebd21b 238ok( $x eq "cd", 'a match nested in the RHS of a substitution' );
fb73857a 239
c277df42
IZ
240# Subst and lookbehind
241
242$_="ccccc";
e8ebd21b
RGS
243$snum = s/(?<!x)c/x/g;
244ok( $_ eq "xxxxx" && $snum == 5 );
c277df42
IZ
245
246$_="ccccc";
e8ebd21b
RGS
247$snum = s/(?<!x)(c)/x/g;
248ok( $_ eq "xxxxx" && $snum == 5 );
c277df42
IZ
249
250$_="foobbarfoobbar";
e8ebd21b
RGS
251$snum = s/(?<!r)foobbar/foobar/g;
252ok( $_ eq "foobarfoobbar" && $snum == 1 );
c277df42
IZ
253
254$_="foobbarfoobbar";
e8ebd21b
RGS
255$snum = s/(?<!ar)(foobbar)/foobar/g;
256ok( $_ eq "foobarfoobbar" && $snum == 1 );
c277df42
IZ
257
258$_="foobbarfoobbar";
e8ebd21b
RGS
259$snum = s/(?<!ar)foobbar/foobar/g;
260ok( $_ eq "foobarfoobbar" && $snum == 1 );
c277df42 261
fb73857a
PP
262eval 's{foo} # this is a comment, not a delimiter
263 {bar};';
e8ebd21b 264ok( ! @?, 'parsing of split subst with comment' );
f3ea7b5e 265
f3ea7b5e 266$_="baacbaa";
e8ebd21b
RGS
267$snum = tr/a/b/s;
268ok( $_ eq "bbcbb" && $snum == 4,
269 'check if squashing works at the end of string' );
f3ea7b5e 270
2216f30a 271$_ = "ab";
e8ebd21b 272ok( s/a/b/ == 1 );
ce862d02
IZ
273
274$_ = <<'EOL';
275 $url = new URI::URL "http://www/"; die if $url eq "xXx";
276EOL
277$^R = 'junk';
278
279$foo = ' $@%#lowercase $@%# lowercase UPPERCASE$@%#UPPERCASE' .
280 ' $@%#lowercase$@%#lowercase$@%# lowercase lowercase $@%#lowercase' .
281 ' lowercase $@%#MiXeD$@%# ';
282
e8ebd21b 283$snum =
ce862d02
IZ
284s{ \d+ \b [,.;]? (?{ 'digits' })
285 |
286 [a-z]+ \b [,.;]? (?{ 'lowercase' })
287 |
288 [A-Z]+ \b [,.;]? (?{ 'UPPERCASE' })
289 |
290 [A-Z] [a-z]+ \b [,.;]? (?{ 'Capitalized' })
291 |
292 [A-Za-z]+ \b [,.;]? (?{ 'MiXeD' })
293 |
294 [A-Za-z0-9]+ \b [,.;]? (?{ 'alphanumeric' })
295 |
296 \s+ (?{ ' ' })
297 |
298 [^A-Za-z0-9\s]+ (?{ '$@%#' })
299}{$^R}xg;
e8ebd21b 300ok( $_ eq $foo );
8e5e9ebe
RGS
301ok( $snum == 31 );
302
303$_ = 'a' x 6;
304$snum = s/a(?{})//g;
305ok( $_ eq '' && $snum == 6 );
ce862d02 306
2beec16e 307$_ = 'x' x 20;
e8ebd21b 308$snum = s/(\d*|x)/<$1>/g;
2beec16e 309$foo = '<>' . ('<x><>' x 20) ;
e8ebd21b 310ok( $_ eq $foo && $snum == 41 );
ad94a511
IZ
311
312$t = 'aaaaaaaaa';
313
314$_ = $t;
315pos = 6;
e8ebd21b
RGS
316$snum = s/\Ga/xx/g;
317ok( $_ eq 'aaaaaaxxxxxx' && $snum == 3 );
ad94a511
IZ
318
319$_ = $t;
320pos = 6;
e8ebd21b
RGS
321$snum = s/\Ga/x/g;
322ok( $_ eq 'aaaaaaxxx' && $snum == 3 );
ad94a511
IZ
323
324$_ = $t;
325pos = 6;
326s/\Ga/xx/;
e8ebd21b 327ok( $_ eq 'aaaaaaxxaa' );
ad94a511
IZ
328
329$_ = $t;
330pos = 6;
331s/\Ga/x/;
e8ebd21b 332ok( $_ eq 'aaaaaaxaa' );
ad94a511
IZ
333
334$_ = $t;
e8ebd21b
RGS
335$snum = s/\Ga/xx/g;
336ok( $_ eq 'xxxxxxxxxxxxxxxxxx' && $snum == 9 );
ad94a511
IZ
337
338$_ = $t;
e8ebd21b
RGS
339$snum = s/\Ga/x/g;
340ok( $_ eq 'xxxxxxxxx' && $snum == 9 );
ad94a511
IZ
341
342$_ = $t;
343s/\Ga/xx/;
e8ebd21b 344ok( $_ eq 'xxaaaaaaaa' );
ad94a511
IZ
345
346$_ = $t;
347s/\Ga/x/;
e8ebd21b 348ok( $_ eq 'xaaaaaaaa' );
ad94a511 349
f5c9036e 350$_ = 'aaaa';
e8ebd21b
RGS
351$snum = s/\ba/./g;
352ok( $_ eq '.aaa' && $snum == 1 );
ad94a511 353
e9fa98b2 354eval q% s/a/"b"}/e %;
e8ebd21b 355ok( $@ =~ /Bad evalled substitution/ );
e9fa98b2 356eval q% ($_ = "x") =~ s/(.)/"$1 "/e %;
e8ebd21b 357ok( $_ eq "x " and !length $@ );
43a16006
HS
358$x = $x = 'interp';
359eval q% ($_ = "x") =~ s/x(($x)*)/"$1"/e %;
e8ebd21b 360ok( $_ eq '' and !length $@ );
e9fa98b2 361
653099ff 362$_ = "C:/";
e8ebd21b 363ok( !s/^([a-z]:)/\u$1/ );
e9fa98b2 364
12d33761 365$_ = "Charles Bronson";
e8ebd21b
RGS
366$snum = s/\B\w//g;
367ok( $_ eq "C B" && $snum == 12 );
5b71a6a7
A
368
369{
370 use utf8;
371 my $s = "H\303\266he";
372 my $l = my $r = $s;
373 $l =~ s/[^\w]//g;
374 $r =~ s/[^\w\.]//g;
aefe6dfc 375 is($l, $r, "use utf8 \\w");
5b71a6a7 376}
89afcb60
A
377
378my $pv1 = my $pv2 = "Andreas J. K\303\266nig";
379$pv1 =~ s/A/\x{100}/;
380substr($pv2,0,1) = "\x{100}";
381is($pv1, $pv2);
aefe6dfc
JH
382
383{
8514a05a 384 # Gregor Chrupala <gregor.chrupala@star-group.net>
aefe6dfc
JH
385 use utf8;
386 $a = 'Espa&ntilde;a';
387 $a =~ s/&ntilde;/ñ/;
388 like($a, qr/ñ/, "use utf8 RHS");
389}
390
391{
392 use utf8;
393 $a = 'España España';
394 $a =~ s/ñ/&ntilde;/;
395 like($a, qr/ñ/, "use utf8 LHS");
396}
397
398{
399 use utf8;
400 $a = 'España';
401 $a =~ s/ñ/ñ/;
402 like($a, qr/ñ/, "use utf8 LHS and RHS");
403}
404
8514a05a
JH
405{
406 # SADAHIRO Tomoyuki <bqw10602@nifty.com>
407
408 $a = "\x{100}\x{101}";
409 $a =~ s/\x{101}/\xFF/;
410 like($a, qr/\xFF/);
411 is(length($a), 2);
412
413 $a = "\x{100}\x{101}";
414 $a =~ s/\x{101}/"\xFF"/e;
415 like($a, qr/\xFF/);
416 is(length($a), 2);
417
418 $a = "\x{100}\x{101}";
419 $a =~ s/\x{101}/\xFF\xFF\xFF/;
420 like($a, qr/\xFF\xFF\xFF/);
421 is(length($a), 4);
422
423 $a = "\x{100}\x{101}";
424 $a =~ s/\x{101}/"\xFF\xFF\xFF"/e;
425 like($a, qr/\xFF\xFF\xFF/);
426 is(length($a), 4);
427
428 $a = "\xFF\x{101}";
429 $a =~ s/\xFF/\x{100}/;
430 like($a, qr/\x{100}/);
431 is(length($a), 2);
432
433 $a = "\xFF\x{101}";
434 $a =~ s/\xFF/"\x{100}"/e;
435 like($a, qr/\x{100}/);
436 is(length($a), 2);
437
438 $a = "\xFF";
439 $a =~ s/\xFF/\x{100}/;
440 like($a, qr/\x{100}/);
441 is(length($a), 1);
442
443 $a = "\xFF";
444 $a =~ s/\xFF/"\x{100}"/e;
445 like($a, qr/\x{100}/);
446 is(length($a), 1);
447}