BUG in interpolating and/or substituting NULs in strings?
Jasper Wu
jwu at kepler.com
Wed May 22 02:51:50 AEST 1991
Greg, from perl manpage on s///:
...If the PATTERN evaluates to a null string, the most recent
successful regular expression is used instead....
In article <GNB.91May21123118 at leo.bby.oz.au> gnb at bby.oz.au (Gregory N. Bond) writes:
>#! /usr/local/bin/perl
>
>$NUL = "\0";
>$SOH = "\1";
>$STX = "\2";
>$ETX = "\3";
>
>$_ = "data a${STX}data b${ETX}cc${NUL}${SOH}";
>
> $p = $_;
> $p =~ s/$ETX/<ETX>/og;
> $p =~ s/$STX/<STX>/og;
> $p =~ s/$SOH/<SOH>/og;
> $p =~ s/$NUL/<NUL>/og;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> print "[$p]\n";
>
> $p = $_;
> $p =~ s/$NUL/<NUL>/og;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> $p =~ s/$SOH/<SOH>/og;
> $p =~ s/$STX/<STX>/og;
> $p =~ s/$ETX/<ETX>/og;
> print "[$p]\n";
>
both lines have $NUL evalualtes to null string, and happened to be equivalent
to
$p =~ s/$SOH/<SOH>/og;
that's why you got the (undesirable) result.
>leo% perl t.perl
>[data a<STX>data b<ETX>cc^@<SOH>]
>[data a<STX>data b<ETX>cc^@<NUL>]
>
To get what you want, simply not to evaluate the pattern to null string.
You can either
1) change those two lines to $p =~ s/\0/<NUL>/og;
or (preferrably)
2) change the first four lines to
$NUL = \0;
$SOH = \1;
$STX = \2;
$ETX = \3;
(ie, no double quote) and keep rest of the program intact.
Both ways worked fine when i tested it on my machine.
Hope this helps.
>Greg.
>--
>Gregory Bond, Burdett Buckeridge & Young Ltd, Melbourne, Australia
>Internet: gnb at melba.bby.oz.au non-MX: gnb%melba.bby.oz at uunet.uu.net
>Uucp: {uunet,pyramid,ubc-cs,ukc,mcvax,prlb2,nttlab...}!munnari!melba.bby.oz!gnb
--jasper
============================
Jasper Wu jwu at kepler.com
More information about the Comp.sources.bugs
mailing list