There are differences in the variable after a non-global substitution vs. a global substitution. After a non-global substitution, a reference to the scalar value is of type SVt_PVIV, as opposed to SVt_PV for global substituion. So I changed write_client() Apache.xs to also check if the reference is of type SVt_PVIV, and it now works. Doug, could you apply this patch to Apache.xs? Thanks. Also, thanks to Ken Williams for the useful pointers. PATCH: --- Apache.xs.old Wed Aug 9 10:23:31 2000 +++ Apache.xs Wed Aug 9 10:23:13 2000 @@ -1076,7 +1076,7 @@ for(i = 1; i <= items - 1; i++) { int sent = 0; - SV *sv = SvROK(ST(i)) && (SvTYPE(SvRV(ST(i))) == SVt_PV) ? + SV *sv = SvROK(ST(i)) && (SvTYPE(SvRV(ST(i))) == SVt_PV || +SvTYPE(SvRV(ST(i))) == SVt_PVIV) ? (SV*)SvRV(ST(i)) : ST(i); buffer = SvPV(sv, len); #ifdef APACHE_SSL TEST CODE: #!/usr/bin/perl use Devel::Peek; $text1 = "hello"; $text2 = "hello"; $text3 = "hello"; $text2 =~ s/hello/hi/; $text3 =~ s/hello/hi/g; print "reference to variable without any substitution\n"; Dump \$text1; print "\nreference to variable after non-global substitution\n"; Dump \$text2; print "\nreference to variable after global substitution\n"; Dump \$text3; TEST OUTPUT: reference to variable without any substitution SV = RV(0x8100370) at 0x80ea8f8 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x80f8ca8 SV = PV(0x80eabc4) at 0x80f8ca8 REFCNT = 2 FLAGS = (POK,pPOK) PV = 0x80f7868 "hello"\0 CUR = 5 LEN = 6 reference to variable after non-global substitution SV = RV(0x8100370) at 0x80ea8f8 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x80f8c54 SV = PVIV(0x80eb010) at 0x80f8c54 REFCNT = 2 FLAGS = (POK,OOK,pPOK) IV = 3 (OFFSET) PV = 0x80efa1b ( "hel" . ) "hi"\0 CUR = 2 LEN = 3 reference to variable after global substitution SV = RV(0x8100370) at 0x80ea8f8 REFCNT = 1 FLAGS = (TEMP,ROK) RV = 0x80fd160 SV = PV(0x80eabac) at 0x80fd160 REFCNT = 2 FLAGS = (POK,pPOK) PV = 0x80f75a0 "hi"\0 CUR = 2 LEN = 6 Ken Williams wrote: > T.J., if you grok XS you might have a look at this part of > write_client() in Apache.xs: > > for(i = 1; i <= items - 1; i++) { > int sent = 0; > SV *sv = SvROK(ST(i)) && (SvTYPE(SvRV(ST(i))) == SVt_PV) ? > (SV*)SvRV(ST(i)) : ST(i); > buffer = SvPV(sv, len); > > > Try looking at your $text with Devel::Peek to see whether there are any > differences in what it contains in the two cases.