Bug#681849: perl: regex negative lookbehind does not work before $

Andy Isaacson adi at hexapodia.org
Tue Jul 17 06:06:05 UTC 2012


Package: perl
Version: 5.14.2-6
Severity: normal

Dear Maintainer,

The negative look-behind assertion does not work correctly before $ (the
end-of-line assertion).

I expect to be able to say "match lines that do not end in bar"
using the regex /(?<!bar)$/ .  However this does not work:

% (echo foo; echo bar; echo foobaz) | perl -ne 'print if(/(?<!bar)$/)'
foo
bar
foobaz
%

It should not have printed "bar" above.  

A similar pattern using /^(?!bar)/ works to say "lines that do not
start with bar", and negative look-behind works before a string:

# negative lookahead
% (echo foo; echo bar; echo foobaz) | perl -ne 'print if(/^(?!foo)/)'
bar
%

# negative lookbehind before string
% (echo foo; echo bar; echo foobaz) | sed 's/$/x/g' | \
         perl -ne 'print if(/(?<!bar)x$/)'
foox
foobazx
%

I found a workaround that may shed light on the root cause of the
problem.  Normally /$/ matches the end of a string or the line-ending
character at the end of a <> string, and regex behavior with $ is not
changed by chomp()ing the line-ending-character away.  But in this case,
there is a difference.  If I "chomp;" before matching, the negative
look-behind assertion works correctly:

% (echo foo; echo bar; echo foobaz) | perl -ne 'chomp; print if(/(?<!bar)$/)'
foofoobaz
%

Note that it did not print "bar" above, correctly implementing the behavior
documented in perlre(1).


-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'stable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.4.0-rc4-00095-g95f7147 (SMP w/4 CPU cores)
Locale: LANG=en_US.utf8, LC_CTYPE=en_US.utf8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages perl depends on:
ii  libbz2-1.0    1.0.6-1
ii  libc6         2.13-26
ii  libdb5.1      5.1.29-1
ii  libgdbm3      1.8.3-10
ii  perl-base     5.14.2-6
ii  perl-modules  5.14.2-6
ii  zlib1g        1:1.2.3.4.dfsg-3

Versions of packages perl recommends:
ii  netbase  4.47

Versions of packages perl suggests:
ii  libterm-readline-gnu-perl | libterm-readline-perl-perl  <none>
ii  make                                                    3.81-8.1
ii  perl-doc                                                5.14.2-6

-- no debconf information




More information about the Perl-maintainers mailing list