1b39c5158Smillert#!./perl 2b39c5158Smillert 3b39c5158SmillertBEGIN { 4b39c5158Smillert chdir 't' if -d 't'; 5b39c5158Smillert require './test.pl'; 6b8851fccSafresh1 set_up_inc('../lib'); 7b39c5158Smillert} 8b39c5158Smillert 952736614Safresh1plan tests => 42; 10b39c5158Smillert 11b39c5158Smillert$^R = undef; 12b39c5158Smillertlike( 'a', qr/^a(?{1})(?:b(?{2}))?/, 'a =~ ab?' ); 13b39c5158Smillertcmp_ok( $^R, '==', 1, '..$^R after a =~ ab?' ); 14b39c5158Smillert 15b39c5158Smillert$^R = undef; 16b39c5158Smillertunlike( 'abc', qr/^a(?{3})(?:b(?{4}))$/, 'abc !~ a(?:b)$' ); 17b39c5158Smillertok( !defined $^R, '..$^R after abc !~ a(?:b)$' ); 18b39c5158Smillert 19b39c5158Smillert$^R = undef; 20b39c5158Smillertlike( 'ab', qr/^a(?{5})b(?{6})/, 'ab =~ ab' ); 21b39c5158Smillertcmp_ok( $^R, '==', 6, '..$^R after ab =~ ab' ); 22b39c5158Smillert 23b39c5158Smillert$^R = undef; 24b39c5158Smillertlike( 'ab', qr/^a(?{7})(?:b(?{8}))?/, 'ab =~ ab?' ); 25b39c5158Smillert 26b39c5158Smillertcmp_ok( $^R, '==', 8, '..$^R after ab =~ ab?' ); 27b39c5158Smillert 28b39c5158Smillert$^R = undef; 29b39c5158Smillertlike( 'ab', qr/^a(?{9})b?(?{10})/, 'ab =~ ab? (2)' ); 30b39c5158Smillertcmp_ok( $^R, '==', 10, '..$^R after ab =~ ab? (2)' ); 31b39c5158Smillert 32b39c5158Smillert$^R = undef; 33b39c5158Smillertlike( 'ab', qr/^(a(?{11})(?:b(?{12})))?/, 'ab =~ (ab)? (3)' ); 34b39c5158Smillertcmp_ok( $^R, '==', 12, '..$^R after ab =~ ab? (3)' ); 35b39c5158Smillert 36b39c5158Smillert$^R = undef; 37b39c5158Smillertunlike( 'ac', qr/^a(?{13})b(?{14})/, 'ac !~ ab' ); 38b39c5158Smillertok( !defined $^R, '..$^R after ac !~ ab' ); 39b39c5158Smillert 40b39c5158Smillert$^R = undef; 41b39c5158Smillertlike( 'ac', qr/^a(?{15})(?:b(?{16}))?/, 'ac =~ ab?' ); 42b39c5158Smillertcmp_ok( $^R, '==', 15, '..$^R after ac =~ ab?' ); 43b39c5158Smillert 44b39c5158Smillertmy @ar; 45b39c5158Smillertlike( 'ab', qr/^a(?{push @ar,101})(?:b(?{push @ar,102}))?/, 'ab =~ ab? with code push' ); 46b39c5158Smillertcmp_ok( scalar(@ar), '==', 2, '..@ar pushed' ); 47b39c5158Smillertcmp_ok( $ar[0], '==', 101, '..first element pushed' ); 48b39c5158Smillertcmp_ok( $ar[1], '==', 102, '..second element pushed' ); 49b39c5158Smillert 50b39c5158Smillert$^R = undef; 51b39c5158Smillertunlike( 'a', qr/^a(?{103})b(?{104})/, 'a !~ ab with code push' ); 52b39c5158Smillertok( !defined $^R, '..$^R after a !~ ab with code push' ); 53b39c5158Smillert 54b39c5158Smillert@ar = (); 55b39c5158Smillertunlike( 'a', qr/^a(?{push @ar,105})b(?{push @ar,106})/, 'a !~ ab (push)' ); 56b39c5158Smillertcmp_ok( scalar(@ar), '==', 0, '..nothing pushed' ); 57b39c5158Smillert 58b39c5158Smillert@ar = (); 59b39c5158Smillertunlike( 'abc', qr/^a(?{push @ar,107})b(?{push @ar,108})$/, 'abc !~ ab$ (push)' ); 60b39c5158Smillertcmp_ok( scalar(@ar), '==', 0, '..still nothing pushed' ); 61b39c5158Smillert 62*9f11ffb7Safresh1our @var; 63b39c5158Smillert 64b39c5158Smillertlike( 'ab', qr/^a(?{push @var,109})(?:b(?{push @var,110}))?/, 'ab =~ ab? push to package var' ); 65b39c5158Smillertcmp_ok( scalar(@var), '==', 2, '..@var pushed' ); 66b39c5158Smillertcmp_ok( $var[0], '==', 109, '..first element pushed (package)' ); 67b39c5158Smillertcmp_ok( $var[1], '==', 110, '..second element pushed (package)' ); 68b39c5158Smillert 69b39c5158Smillert@var = (); 70b39c5158Smillertunlike( 'a', qr/^a(?{push @var,111})b(?{push @var,112})/, 'a !~ ab (push package var)' ); 71b39c5158Smillertcmp_ok( scalar(@var), '==', 0, '..nothing pushed (package)' ); 72b39c5158Smillert 73b39c5158Smillert@var = (); 74b39c5158Smillertunlike( 'abc', qr/^a(?{push @var,113})b(?{push @var,114})$/, 'abc !~ ab$ (push package var)' ); 75b39c5158Smillertcmp_ok( scalar(@var), '==', 0, '..still nothing pushed (package)' ); 76b39c5158Smillert 77b39c5158Smillert{ 78b39c5158Smillert local $^R = undef; 79b39c5158Smillert ok( 'ac' =~ /^a(?{30})(?:b(?{31})|c(?{32}))?/, 'ac =~ a(?:b|c)?' ); 80b39c5158Smillert ok( $^R == 32, '$^R == 32' ); 81b39c5158Smillert} 82b39c5158Smillert{ 83b39c5158Smillert local $^R = undef; 84b39c5158Smillert ok( 'abbb' =~ /^a(?{36})(?:b(?{37})|c(?{38}))+/, 'abbbb =~ a(?:b|c)+' ); 85b39c5158Smillert ok( $^R == 37, '$^R == 37' ) or print "# \$^R=$^R\n"; 86b39c5158Smillert} 8791f110e0Safresh1 8891f110e0Safresh1# Broken temporarily by the jumbo re-eval rewrite in 5.17.1; fixed in .6 8991f110e0Safresh1{ 9091f110e0Safresh1 use re 'eval'; 9191f110e0Safresh1 $x = "(?{})"; 9291f110e0Safresh1 is eval { "a" =~ /a++(?{})+$x/x } || $@, '1', '/a++(?{})+$code_block/' 9391f110e0Safresh1} 946fb12b70Safresh1 956fb12b70Safresh1# [perl #78194] $_ in code block aliasing op return values 966fb12b70Safresh1"$_" =~ /(?{ is \$_, \$_, 976fb12b70Safresh1 '[perl #78194] \$_ == \$_ when $_ aliases "$x"' })/; 9852736614Safresh1 9952736614Safresh1@a = 1..3; 10052736614Safresh1like eval { qr/@a(?{})/ }, qr/1 2 3\(\?\{\}\)/, 'qr/@a(?{})/'; 10152736614Safresh1 10252736614Safresh1# Not a code block, but looks a bit like one. (Failed an assertion from 10352736614Safresh1# 5.17.1 to 5.21.6.) 10452736614Safresh1ok "(?{" =~ qr/\Q(?{/, 'qr/\Q(?{/'; 105