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