| 1 | #!./perl -wT
|
|---|
| 2 |
|
|---|
| 3 | BEGIN {
|
|---|
| 4 | chdir 't' if -d 't';
|
|---|
| 5 | @INC = '../lib';
|
|---|
| 6 | require Config; import Config;
|
|---|
| 7 | }
|
|---|
| 8 |
|
|---|
| 9 | require './test.pl';
|
|---|
| 10 | plan( tests => 131 );
|
|---|
| 11 |
|
|---|
| 12 | $x = 'foo';
|
|---|
| 13 | $_ = "x";
|
|---|
| 14 | s/x/\$x/;
|
|---|
| 15 | ok( $_ eq '$x', ":$_: eq :\$x:" );
|
|---|
| 16 |
|
|---|
| 17 | $_ = "x";
|
|---|
| 18 | s/x/$x/;
|
|---|
| 19 | ok( $_ eq 'foo', ":$_: eq :foo:" );
|
|---|
| 20 |
|
|---|
| 21 | $_ = "x";
|
|---|
| 22 | s/x/\$x $x/;
|
|---|
| 23 | ok( $_ eq '$x foo', ":$_: eq :\$x foo:" );
|
|---|
| 24 |
|
|---|
| 25 | $b = 'cd';
|
|---|
| 26 | ($a = 'abcdef') =~ s<(b${b}e)>'\n$1';
|
|---|
| 27 | ok( $1 eq 'bcde' && $a eq 'a\n$1f', ":$1: eq :bcde: ; :$a: eq :a\\n\$1f:" );
|
|---|
| 28 |
|
|---|
| 29 | $a = 'abacada';
|
|---|
| 30 | ok( ($a =~ s/a/x/g) == 4 && $a eq 'xbxcxdx' );
|
|---|
| 31 |
|
|---|
| 32 | ok( ($a =~ s/a/y/g) == 0 && $a eq 'xbxcxdx' );
|
|---|
| 33 |
|
|---|
| 34 | ok( ($a =~ s/b/y/g) == 1 && $a eq 'xyxcxdx' );
|
|---|
| 35 |
|
|---|
| 36 | $_ = 'ABACADA';
|
|---|
| 37 | ok( /a/i && s///gi && $_ eq 'BCD' );
|
|---|
| 38 |
|
|---|
| 39 | $_ = '\\' x 4;
|
|---|
| 40 | ok( length($_) == 4 );
|
|---|
| 41 | $snum = s/\\/\\\\/g;
|
|---|
| 42 | ok( $_ eq '\\' x 8 && $snum == 4 );
|
|---|
| 43 |
|
|---|
| 44 | $_ = '\/' x 4;
|
|---|
| 45 | ok( length($_) == 8 );
|
|---|
| 46 | $snum = s/\//\/\//g;
|
|---|
| 47 | ok( $_ eq '\\//' x 4 && $snum == 4 );
|
|---|
| 48 | ok( length($_) == 12 );
|
|---|
| 49 |
|
|---|
| 50 | $_ = 'aaaXXXXbbb';
|
|---|
| 51 | s/^a//;
|
|---|
| 52 | ok( $_ eq 'aaXXXXbbb' );
|
|---|
| 53 |
|
|---|
| 54 | $_ = 'aaaXXXXbbb';
|
|---|
| 55 | s/a//;
|
|---|
| 56 | ok( $_ eq 'aaXXXXbbb' );
|
|---|
| 57 |
|
|---|
| 58 | $_ = 'aaaXXXXbbb';
|
|---|
| 59 | s/^a/b/;
|
|---|
| 60 | ok( $_ eq 'baaXXXXbbb' );
|
|---|
| 61 |
|
|---|
| 62 | $_ = 'aaaXXXXbbb';
|
|---|
| 63 | s/a/b/;
|
|---|
| 64 | ok( $_ eq 'baaXXXXbbb' );
|
|---|
| 65 |
|
|---|
| 66 | $_ = 'aaaXXXXbbb';
|
|---|
| 67 | s/aa//;
|
|---|
| 68 | ok( $_ eq 'aXXXXbbb' );
|
|---|
| 69 |
|
|---|
| 70 | $_ = 'aaaXXXXbbb';
|
|---|
| 71 | s/aa/b/;
|
|---|
| 72 | ok( $_ eq 'baXXXXbbb' );
|
|---|
| 73 |
|
|---|
| 74 | $_ = 'aaaXXXXbbb';
|
|---|
| 75 | s/b$//;
|
|---|
| 76 | ok( $_ eq 'aaaXXXXbb' );
|
|---|
| 77 |
|
|---|
| 78 | $_ = 'aaaXXXXbbb';
|
|---|
| 79 | s/b//;
|
|---|
| 80 | ok( $_ eq 'aaaXXXXbb' );
|
|---|
| 81 |
|
|---|
| 82 | $_ = 'aaaXXXXbbb';
|
|---|
| 83 | s/bb//;
|
|---|
| 84 | ok( $_ eq 'aaaXXXXb' );
|
|---|
| 85 |
|
|---|
| 86 | $_ = 'aaaXXXXbbb';
|
|---|
| 87 | s/aX/y/;
|
|---|
| 88 | ok( $_ eq 'aayXXXbbb' );
|
|---|
| 89 |
|
|---|
| 90 | $_ = 'aaaXXXXbbb';
|
|---|
| 91 | s/Xb/z/;
|
|---|
| 92 | ok( $_ eq 'aaaXXXzbb' );
|
|---|
| 93 |
|
|---|
| 94 | $_ = 'aaaXXXXbbb';
|
|---|
| 95 | s/aaX.*Xbb//;
|
|---|
| 96 | ok( $_ eq 'ab' );
|
|---|
| 97 |
|
|---|
| 98 | $_ = 'aaaXXXXbbb';
|
|---|
| 99 | s/bb/x/;
|
|---|
| 100 | ok( $_ eq 'aaaXXXXxb' );
|
|---|
| 101 |
|
|---|
| 102 | # now for some unoptimized versions of the same.
|
|---|
| 103 |
|
|---|
| 104 | $_ = 'aaaXXXXbbb';
|
|---|
| 105 | $x ne $x || s/^a//;
|
|---|
| 106 | ok( $_ eq 'aaXXXXbbb' );
|
|---|
| 107 |
|
|---|
| 108 | $_ = 'aaaXXXXbbb';
|
|---|
| 109 | $x ne $x || s/a//;
|
|---|
| 110 | ok( $_ eq 'aaXXXXbbb' );
|
|---|
| 111 |
|
|---|
| 112 | $_ = 'aaaXXXXbbb';
|
|---|
| 113 | $x ne $x || s/^a/b/;
|
|---|
| 114 | ok( $_ eq 'baaXXXXbbb' );
|
|---|
| 115 |
|
|---|
| 116 | $_ = 'aaaXXXXbbb';
|
|---|
| 117 | $x ne $x || s/a/b/;
|
|---|
| 118 | ok( $_ eq 'baaXXXXbbb' );
|
|---|
| 119 |
|
|---|
| 120 | $_ = 'aaaXXXXbbb';
|
|---|
| 121 | $x ne $x || s/aa//;
|
|---|
| 122 | ok( $_ eq 'aXXXXbbb' );
|
|---|
| 123 |
|
|---|
| 124 | $_ = 'aaaXXXXbbb';
|
|---|
| 125 | $x ne $x || s/aa/b/;
|
|---|
| 126 | ok( $_ eq 'baXXXXbbb' );
|
|---|
| 127 |
|
|---|
| 128 | $_ = 'aaaXXXXbbb';
|
|---|
| 129 | $x ne $x || s/b$//;
|
|---|
| 130 | ok( $_ eq 'aaaXXXXbb' );
|
|---|
| 131 |
|
|---|
| 132 | $_ = 'aaaXXXXbbb';
|
|---|
| 133 | $x ne $x || s/b//;
|
|---|
| 134 | ok( $_ eq 'aaaXXXXbb' );
|
|---|
| 135 |
|
|---|
| 136 | $_ = 'aaaXXXXbbb';
|
|---|
| 137 | $x ne $x || s/bb//;
|
|---|
| 138 | ok( $_ eq 'aaaXXXXb' );
|
|---|
| 139 |
|
|---|
| 140 | $_ = 'aaaXXXXbbb';
|
|---|
| 141 | $x ne $x || s/aX/y/;
|
|---|
| 142 | ok( $_ eq 'aayXXXbbb' );
|
|---|
| 143 |
|
|---|
| 144 | $_ = 'aaaXXXXbbb';
|
|---|
| 145 | $x ne $x || s/Xb/z/;
|
|---|
| 146 | ok( $_ eq 'aaaXXXzbb' );
|
|---|
| 147 |
|
|---|
| 148 | $_ = 'aaaXXXXbbb';
|
|---|
| 149 | $x ne $x || s/aaX.*Xbb//;
|
|---|
| 150 | ok( $_ eq 'ab' );
|
|---|
| 151 |
|
|---|
| 152 | $_ = 'aaaXXXXbbb';
|
|---|
| 153 | $x ne $x || s/bb/x/;
|
|---|
| 154 | ok( $_ eq 'aaaXXXXxb' );
|
|---|
| 155 |
|
|---|
| 156 | $_ = 'abc123xyz';
|
|---|
| 157 | s/(\d+)/$1*2/e; # yields 'abc246xyz'
|
|---|
| 158 | ok( $_ eq 'abc246xyz' );
|
|---|
| 159 | s/(\d+)/sprintf("%5d",$1)/e; # yields 'abc 246xyz'
|
|---|
| 160 | ok( $_ eq 'abc 246xyz' );
|
|---|
| 161 | s/(\w)/$1 x 2/eg; # yields 'aabbcc 224466xxyyzz'
|
|---|
| 162 | ok( $_ eq 'aabbcc 224466xxyyzz' );
|
|---|
| 163 |
|
|---|
| 164 | $_ = "aaaaa";
|
|---|
| 165 | ok( y/a/b/ == 5 );
|
|---|
| 166 | ok( y/a/b/ == 0 );
|
|---|
| 167 | ok( y/b// == 5 );
|
|---|
| 168 | ok( y/b/c/s == 5 );
|
|---|
| 169 | ok( y/c// == 1 );
|
|---|
| 170 | ok( y/c//d == 1 );
|
|---|
| 171 | ok( $_ eq "" );
|
|---|
| 172 |
|
|---|
| 173 | $_ = "Now is the %#*! time for all good men...";
|
|---|
| 174 | ok( ($x=(y/a-zA-Z //cd)) == 7 );
|
|---|
| 175 | ok( y/ / /s == 8 );
|
|---|
| 176 |
|
|---|
| 177 | $_ = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|---|
| 178 | tr/a-z/A-Z/;
|
|---|
| 179 |
|
|---|
| 180 | ok( $_ eq 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' );
|
|---|
| 181 |
|
|---|
| 182 | # same as tr/A-Z/a-z/;
|
|---|
| 183 | if (defined $Config{ebcdic} && $Config{ebcdic} eq 'define') { # EBCDIC.
|
|---|
| 184 | no utf8;
|
|---|
| 185 | y[\301-\351][\201-\251];
|
|---|
| 186 | } else { # Ye Olde ASCII. Or something like it.
|
|---|
| 187 | y[\101-\132][\141-\172];
|
|---|
| 188 | }
|
|---|
| 189 |
|
|---|
| 190 | ok( $_ eq 'abcdefghijklmnopqrstuvwxyz0123456789' );
|
|---|
| 191 |
|
|---|
| 192 | SKIP: {
|
|---|
| 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' );
|
|---|
| 200 | }
|
|---|
| 201 |
|
|---|
| 202 | $_ = '+,-';
|
|---|
| 203 | tr/+\--/a\/c/;
|
|---|
| 204 | ok( $_ eq 'a,/' );
|
|---|
| 205 |
|
|---|
| 206 | $_ = '+,-';
|
|---|
| 207 | tr/-+,/ab\-/;
|
|---|
| 208 | ok( $_ eq 'b-a' );
|
|---|
| 209 |
|
|---|
| 210 |
|
|---|
| 211 | # test recursive substitutions
|
|---|
| 212 | # code based on the recursive expansion of makefile variables
|
|---|
| 213 |
|
|---|
| 214 | my %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 | );
|
|---|
| 219 | sub var {
|
|---|
| 220 | my($var,$level) = @_;
|
|---|
| 221 | return "\$($var)" unless exists $MK{$var};
|
|---|
| 222 | return exp_vars($MK{$var}, $level+1); # can recurse
|
|---|
| 223 | }
|
|---|
| 224 | sub 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 |
|
|---|
| 231 | ok( exp_vars('$(AAAAA)',0) eq 'D' );
|
|---|
| 232 | ok( exp_vars('$(E)',0) eq 'p HHHHH q' );
|
|---|
| 233 | ok( exp_vars('$(DIR)',0) eq '$(UNDEFINEDNAME)/xxx' );
|
|---|
| 234 | ok( exp_vars('foo $(DIR)/yyy bar',0) eq 'foo $(UNDEFINEDNAME)/xxx/yyy bar' );
|
|---|
| 235 |
|
|---|
| 236 | $_ = "abcd";
|
|---|
| 237 | s/(..)/$x = $1, m#.#/eg;
|
|---|
| 238 | ok( $x eq "cd", 'a match nested in the RHS of a substitution' );
|
|---|
| 239 |
|
|---|
| 240 | # Subst and lookbehind
|
|---|
| 241 |
|
|---|
| 242 | $_="ccccc";
|
|---|
| 243 | $snum = s/(?<!x)c/x/g;
|
|---|
| 244 | ok( $_ eq "xxxxx" && $snum == 5 );
|
|---|
| 245 |
|
|---|
| 246 | $_="ccccc";
|
|---|
| 247 | $snum = s/(?<!x)(c)/x/g;
|
|---|
| 248 | ok( $_ eq "xxxxx" && $snum == 5 );
|
|---|
| 249 |
|
|---|
| 250 | $_="foobbarfoobbar";
|
|---|
| 251 | $snum = s/(?<!r)foobbar/foobar/g;
|
|---|
| 252 | ok( $_ eq "foobarfoobbar" && $snum == 1 );
|
|---|
| 253 |
|
|---|
| 254 | $_="foobbarfoobbar";
|
|---|
| 255 | $snum = s/(?<!ar)(foobbar)/foobar/g;
|
|---|
| 256 | ok( $_ eq "foobarfoobbar" && $snum == 1 );
|
|---|
| 257 |
|
|---|
| 258 | $_="foobbarfoobbar";
|
|---|
| 259 | $snum = s/(?<!ar)foobbar/foobar/g;
|
|---|
| 260 | ok( $_ eq "foobarfoobbar" && $snum == 1 );
|
|---|
| 261 |
|
|---|
| 262 | eval 's{foo} # this is a comment, not a delimiter
|
|---|
| 263 | {bar};';
|
|---|
| 264 | ok( ! @?, 'parsing of split subst with comment' );
|
|---|
| 265 |
|
|---|
| 266 | $_="baacbaa";
|
|---|
| 267 | $snum = tr/a/b/s;
|
|---|
| 268 | ok( $_ eq "bbcbb" && $snum == 4,
|
|---|
| 269 | 'check if squashing works at the end of string' );
|
|---|
| 270 |
|
|---|
| 271 | $_ = "ab";
|
|---|
| 272 | ok( s/a/b/ == 1 );
|
|---|
| 273 |
|
|---|
| 274 | $_ = <<'EOL';
|
|---|
| 275 | $url = new URI::URL "http://www/"; die if $url eq "xXx";
|
|---|
| 276 | EOL
|
|---|
| 277 | $^R = 'junk';
|
|---|
| 278 |
|
|---|
| 279 | $foo = ' $@%#lowercase $@%# lowercase UPPERCASE$@%#UPPERCASE' .
|
|---|
| 280 | ' $@%#lowercase$@%#lowercase$@%# lowercase lowercase $@%#lowercase' .
|
|---|
| 281 | ' lowercase $@%#MiXeD$@%# ';
|
|---|
| 282 |
|
|---|
| 283 | $snum =
|
|---|
| 284 | s{ \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;
|
|---|
| 300 | ok( $_ eq $foo );
|
|---|
| 301 | ok( $snum == 31 );
|
|---|
| 302 |
|
|---|
| 303 | $_ = 'a' x 6;
|
|---|
| 304 | $snum = s/a(?{})//g;
|
|---|
| 305 | ok( $_ eq '' && $snum == 6 );
|
|---|
| 306 |
|
|---|
| 307 | $_ = 'x' x 20;
|
|---|
| 308 | $snum = s/(\d*|x)/<$1>/g;
|
|---|
| 309 | $foo = '<>' . ('<x><>' x 20) ;
|
|---|
| 310 | ok( $_ eq $foo && $snum == 41 );
|
|---|
| 311 |
|
|---|
| 312 | $t = 'aaaaaaaaa';
|
|---|
| 313 |
|
|---|
| 314 | $_ = $t;
|
|---|
| 315 | pos = 6;
|
|---|
| 316 | $snum = s/\Ga/xx/g;
|
|---|
| 317 | ok( $_ eq 'aaaaaaxxxxxx' && $snum == 3 );
|
|---|
| 318 |
|
|---|
| 319 | $_ = $t;
|
|---|
| 320 | pos = 6;
|
|---|
| 321 | $snum = s/\Ga/x/g;
|
|---|
| 322 | ok( $_ eq 'aaaaaaxxx' && $snum == 3 );
|
|---|
| 323 |
|
|---|
| 324 | $_ = $t;
|
|---|
| 325 | pos = 6;
|
|---|
| 326 | s/\Ga/xx/;
|
|---|
| 327 | ok( $_ eq 'aaaaaaxxaa' );
|
|---|
| 328 |
|
|---|
| 329 | $_ = $t;
|
|---|
| 330 | pos = 6;
|
|---|
| 331 | s/\Ga/x/;
|
|---|
| 332 | ok( $_ eq 'aaaaaaxaa' );
|
|---|
| 333 |
|
|---|
| 334 | $_ = $t;
|
|---|
| 335 | $snum = s/\Ga/xx/g;
|
|---|
| 336 | ok( $_ eq 'xxxxxxxxxxxxxxxxxx' && $snum == 9 );
|
|---|
| 337 |
|
|---|
| 338 | $_ = $t;
|
|---|
| 339 | $snum = s/\Ga/x/g;
|
|---|
| 340 | ok( $_ eq 'xxxxxxxxx' && $snum == 9 );
|
|---|
| 341 |
|
|---|
| 342 | $_ = $t;
|
|---|
| 343 | s/\Ga/xx/;
|
|---|
| 344 | ok( $_ eq 'xxaaaaaaaa' );
|
|---|
| 345 |
|
|---|
| 346 | $_ = $t;
|
|---|
| 347 | s/\Ga/x/;
|
|---|
| 348 | ok( $_ eq 'xaaaaaaaa' );
|
|---|
| 349 |
|
|---|
| 350 | $_ = 'aaaa';
|
|---|
| 351 | $snum = s/\ba/./g;
|
|---|
| 352 | ok( $_ eq '.aaa' && $snum == 1 );
|
|---|
| 353 |
|
|---|
| 354 | eval q% s/a/"b"}/e %;
|
|---|
| 355 | ok( $@ =~ /Bad evalled substitution/ );
|
|---|
| 356 | eval q% ($_ = "x") =~ s/(.)/"$1 "/e %;
|
|---|
| 357 | ok( $_ eq "x " and !length $@ );
|
|---|
| 358 | $x = $x = 'interp';
|
|---|
| 359 | eval q% ($_ = "x") =~ s/x(($x)*)/"$1"/e %;
|
|---|
| 360 | ok( $_ eq '' and !length $@ );
|
|---|
| 361 |
|
|---|
| 362 | $_ = "C:/";
|
|---|
| 363 | ok( !s/^([a-z]:)/\u$1/ );
|
|---|
| 364 |
|
|---|
| 365 | $_ = "Charles Bronson";
|
|---|
| 366 | $snum = s/\B\w//g;
|
|---|
| 367 | ok( $_ eq "C B" && $snum == 12 );
|
|---|
| 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;
|
|---|
| 375 | is($l, $r, "use utf8 \\w");
|
|---|
| 376 | }
|
|---|
| 377 |
|
|---|
| 378 | my $pv1 = my $pv2 = "Andreas J. K\303\266nig";
|
|---|
| 379 | $pv1 =~ s/A/\x{100}/;
|
|---|
| 380 | substr($pv2,0,1) = "\x{100}";
|
|---|
| 381 | is($pv1, $pv2);
|
|---|
| 382 |
|
|---|
| 383 | SKIP: {
|
|---|
| 384 | skip("EBCDIC", 3) if ord("A") == 193;
|
|---|
| 385 |
|
|---|
| 386 | {
|
|---|
| 387 | # Gregor Chrupala <gregor.chrupala@star-group.net>
|
|---|
| 388 | use utf8;
|
|---|
| 389 | $a = 'España';
|
|---|
| 390 | $a =~ s/ñ/ñ/;
|
|---|
| 391 | like($a, qr/ñ/, "use utf8 RHS");
|
|---|
| 392 | }
|
|---|
| 393 |
|
|---|
| 394 | {
|
|---|
| 395 | use utf8;
|
|---|
| 396 | $a = 'España España';
|
|---|
| 397 | $a =~ s/ñ/ñ/;
|
|---|
| 398 | like($a, qr/ñ/, "use utf8 LHS");
|
|---|
| 399 | }
|
|---|
| 400 |
|
|---|
| 401 | {
|
|---|
| 402 | use utf8;
|
|---|
| 403 | $a = 'España';
|
|---|
| 404 | $a =~ s/ñ/ñ/;
|
|---|
| 405 | like($a, qr/ñ/, "use utf8 LHS and RHS");
|
|---|
| 406 | }
|
|---|
| 407 | }
|
|---|
| 408 |
|
|---|
| 409 | {
|
|---|
| 410 | # SADAHIRO Tomoyuki <bqw10602@nifty.com>
|
|---|
| 411 |
|
|---|
| 412 | $a = "\x{100}\x{101}";
|
|---|
| 413 | $a =~ s/\x{101}/\xFF/;
|
|---|
| 414 | like($a, qr/\xFF/);
|
|---|
| 415 | is(length($a), 2, "SADAHIRO utf8 s///");
|
|---|
| 416 |
|
|---|
| 417 | $a = "\x{100}\x{101}";
|
|---|
| 418 | $a =~ s/\x{101}/"\xFF"/e;
|
|---|
| 419 | like($a, qr/\xFF/);
|
|---|
| 420 | is(length($a), 2);
|
|---|
| 421 |
|
|---|
| 422 | $a = "\x{100}\x{101}";
|
|---|
| 423 | $a =~ s/\x{101}/\xFF\xFF\xFF/;
|
|---|
| 424 | like($a, qr/\xFF\xFF\xFF/);
|
|---|
| 425 | is(length($a), 4);
|
|---|
| 426 |
|
|---|
| 427 | $a = "\x{100}\x{101}";
|
|---|
| 428 | $a =~ s/\x{101}/"\xFF\xFF\xFF"/e;
|
|---|
| 429 | like($a, qr/\xFF\xFF\xFF/);
|
|---|
| 430 | is(length($a), 4);
|
|---|
| 431 |
|
|---|
| 432 | $a = "\xFF\x{101}";
|
|---|
| 433 | $a =~ s/\xFF/\x{100}/;
|
|---|
| 434 | like($a, qr/\x{100}/);
|
|---|
| 435 | is(length($a), 2);
|
|---|
| 436 |
|
|---|
| 437 | $a = "\xFF\x{101}";
|
|---|
| 438 | $a =~ s/\xFF/"\x{100}"/e;
|
|---|
| 439 | like($a, qr/\x{100}/);
|
|---|
| 440 | is(length($a), 2);
|
|---|
| 441 |
|
|---|
| 442 | $a = "\xFF";
|
|---|
| 443 | $a =~ s/\xFF/\x{100}/;
|
|---|
| 444 | like($a, qr/\x{100}/);
|
|---|
| 445 | is(length($a), 1);
|
|---|
| 446 |
|
|---|
| 447 | $a = "\xFF";
|
|---|
| 448 | $a =~ s/\xFF/"\x{100}"/e;
|
|---|
| 449 | like($a, qr/\x{100}/);
|
|---|
| 450 | is(length($a), 1);
|
|---|
| 451 | }
|
|---|
| 452 |
|
|---|
| 453 | {
|
|---|
| 454 | # subst with mixed utf8/non-utf8 type
|
|---|
| 455 | my($ua, $ub, $uc, $ud) = ("\x{101}", "\x{102}", "\x{103}", "\x{104}");
|
|---|
| 456 | my($na, $nb) = ("\x{ff}", "\x{fe}");
|
|---|
| 457 | my $a = "$ua--$ub";
|
|---|
| 458 | my $b;
|
|---|
| 459 | ($b = $a) =~ s/--/$na/;
|
|---|
| 460 | is($b, "$ua$na$ub", "s///: replace non-utf8 into utf8");
|
|---|
| 461 | ($b = $a) =~ s/--/--$na--/;
|
|---|
| 462 | is($b, "$ua--$na--$ub", "s///: replace long non-utf8 into utf8");
|
|---|
| 463 | ($b = $a) =~ s/--/$uc/;
|
|---|
| 464 | is($b, "$ua$uc$ub", "s///: replace utf8 into utf8");
|
|---|
| 465 | ($b = $a) =~ s/--/--$uc--/;
|
|---|
| 466 | is($b, "$ua--$uc--$ub", "s///: replace long utf8 into utf8");
|
|---|
| 467 | $a = "$na--$nb";
|
|---|
| 468 | ($b = $a) =~ s/--/$ua/;
|
|---|
| 469 | is($b, "$na$ua$nb", "s///: replace utf8 into non-utf8");
|
|---|
| 470 | ($b = $a) =~ s/--/--$ua--/;
|
|---|
| 471 | is($b, "$na--$ua--$nb", "s///: replace long utf8 into non-utf8");
|
|---|
| 472 |
|
|---|
| 473 | # now with utf8 pattern
|
|---|
| 474 | $a = "$ua--$ub";
|
|---|
| 475 | ($b = $a) =~ s/-($ud)?-/$na/;
|
|---|
| 476 | is($b, "$ua$na$ub", "s///: replace non-utf8 into utf8 (utf8 pattern)");
|
|---|
| 477 | ($b = $a) =~ s/-($ud)?-/--$na--/;
|
|---|
| 478 | is($b, "$ua--$na--$ub", "s///: replace long non-utf8 into utf8 (utf8 pattern)");
|
|---|
| 479 | ($b = $a) =~ s/-($ud)?-/$uc/;
|
|---|
| 480 | is($b, "$ua$uc$ub", "s///: replace utf8 into utf8 (utf8 pattern)");
|
|---|
| 481 | ($b = $a) =~ s/-($ud)?-/--$uc--/;
|
|---|
| 482 | is($b, "$ua--$uc--$ub", "s///: replace long utf8 into utf8 (utf8 pattern)");
|
|---|
| 483 | $a = "$na--$nb";
|
|---|
| 484 | ($b = $a) =~ s/-($ud)?-/$ua/;
|
|---|
| 485 | is($b, "$na$ua$nb", "s///: replace utf8 into non-utf8 (utf8 pattern)");
|
|---|
| 486 | ($b = $a) =~ s/-($ud)?-/--$ua--/;
|
|---|
| 487 | is($b, "$na--$ua--$nb", "s///: replace long utf8 into non-utf8 (utf8 pattern)");
|
|---|
| 488 | ($b = $a) =~ s/-($ud)?-/$na/;
|
|---|
| 489 | is($b, "$na$na$nb", "s///: replace non-utf8 into non-utf8 (utf8 pattern)");
|
|---|
| 490 | ($b = $a) =~ s/-($ud)?-/--$na--/;
|
|---|
| 491 | is($b, "$na--$na--$nb", "s///: replace long non-utf8 into non-utf8 (utf8 pattern)");
|
|---|
| 492 | }
|
|---|
| 493 |
|
|---|
| 494 | $_ = 'aaaa';
|
|---|
| 495 | $r = 'x';
|
|---|
| 496 | $s = s/a(?{})/$r/g;
|
|---|
| 497 | is("<$_> <$s>", "<xxxx> <4>", "[perl #7806]");
|
|---|
| 498 |
|
|---|
| 499 | $_ = 'aaaa';
|
|---|
| 500 | $s = s/a(?{})//g;
|
|---|
| 501 | is("<$_> <$s>", "<> <4>", "[perl #7806]");
|
|---|
| 502 |
|
|---|
| 503 | # [perl #19048] Coredump in silly replacement
|
|---|
| 504 | {
|
|---|
| 505 | local $^W = 0;
|
|---|
| 506 | $_="abcdef\n";
|
|---|
| 507 | s!.!!eg;
|
|---|
| 508 | is($_, "\n", "[perl #19048]");
|
|---|
| 509 | }
|
|---|
| 510 |
|
|---|
| 511 | # [perl #17757] interaction between saw_ampersand and study
|
|---|
| 512 | {
|
|---|
| 513 | my $f = eval q{ $& };
|
|---|
| 514 | $f = "xx";
|
|---|
| 515 | study $f;
|
|---|
| 516 | $f =~ s/x/y/g;
|
|---|
| 517 | is($f, "yy", "[perl #17757]");
|
|---|
| 518 | }
|
|---|
| 519 |
|
|---|
| 520 | # [perl #20684] returned a zero count
|
|---|
| 521 | $_ = "1111";
|
|---|
| 522 | is(s/(??{1})/2/eg, 4, '#20684 s/// with (??{..}) inside');
|
|---|
| 523 |
|
|---|
| 524 | # [perl #20682] @- not visible in replacement
|
|---|
| 525 | $_ = "123";
|
|---|
| 526 | /(2)/; # seed @- with something else
|
|---|
| 527 | s/(1)(2)(3)/$#- (@-)/;
|
|---|
| 528 | is($_, "3 (0 0 1 2)", '#20682 @- not visible in replacement');
|
|---|
| 529 |
|
|---|
| 530 | # [perl #20682] $^N not visible in replacement
|
|---|
| 531 | $_ = "abc";
|
|---|
| 532 | /(a)/; s/(b)|(c)/-$^N/g;
|
|---|
| 533 | is($_,'a-b-c','#20682 $^N not visible in replacement');
|
|---|
| 534 |
|
|---|
| 535 | # [perl #22351] perl bug with 'e' substitution modifier
|
|---|
| 536 | my $name = "chris";
|
|---|
| 537 | {
|
|---|
| 538 | no warnings 'uninitialized';
|
|---|
| 539 | $name =~ s/hr//e;
|
|---|
| 540 | }
|
|---|
| 541 | is($name, "cis", q[#22351 bug with 'e' substitution modifier]);
|
|---|
| 542 |
|
|---|
| 543 |
|
|---|
| 544 | # [perl #34171] $1 didn't honour 'use bytes' in s//e
|
|---|
| 545 | {
|
|---|
| 546 | my $s="\x{100}";
|
|---|
| 547 | my $x;
|
|---|
| 548 | {
|
|---|
| 549 | use bytes;
|
|---|
| 550 | $s=~ s/(..)/$x=$1/e
|
|---|
| 551 | }
|
|---|
| 552 | is(length($x), 2, '[perl #34171]');
|
|---|
| 553 | }
|
|---|
| 554 |
|
|---|
| 555 |
|
|---|