Package: perl-base
Version: 5.18.0-3
Severity: normal
File: /usr/bin/perl
If a regex is precompiled with qr//, but without /p, and then used in
$text =~ /$pat/p, the ${^POSTMATCH} variable is undefined. If I use
qr//p instead, everything works fine. This did work in Perl 5.14, so I
expect that despite the bad style, it should work in Perl 5.18.The attached test case will die in Perl 5.18. -- System Information: Debian Release: jessie/sid APT prefers unstable APT policy: (500, 'unstable'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 3.10-1-amd64 (SMP w/4 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Versions of packages perl-base depends on: ii dpkg 1.17.0 ii libc6 2.17-7 perl-base recommends no packages. Versions of packages perl-base suggests: ii perl 5.18.0-3 -- no debconf information -- brian m. carlson / brian with sandals: Houston, Texas, US +1 832 623 2791 | http://www.crustytoothpaste.net/~bmc | My opinion only OpenPGP: RSA v4 4096b: 88AC E9B2 9196 305B A994 7552 F1BA 225C 0223 B187
#!/usr/bin/perl
use v5.14;
use strict;
use warnings;
transform_named_escapes("foo\\n(AB", "n", "n");
sub transform_named_escapes {
my ($text, $char, $type) = @_;
my $ec = "\\";
# The more complex forms are first because \X will match a ( or [.
my $pat = qr/\Q$ec$char\E(\((\X{2})|\[(\X*?)\]|(\X))/;
# We might end up with something like \*(\*(NA. In this case, parse the
# second escape first, and then stick that into the proper place.
while ($text =~ /$pat/p) {
my $desc = $1;
my $name = $2 || $3 || $4;
my ($pre, $post) = (${^PREMATCH}, ${^POSTMATCH});
die unless defined ${^POSTMATCH};
}
return $text;
}
signature.asc
Description: Digital signature

