On Tue, Aug 13, 2002 at 03:06:40PM -0400, Deven T. Corzine wrote: > The only accurate way to know if the code modifies the variables is to do > some sort of dataflow analysis, and it can't be 100% accurate even then. > (Suppose a "shift" may or may not happen, depending on the parameters, then > $_[2] is modified?) Of course, it should often be possible (at least in > principle) to determine that it's impossible for a particular parameter to > be modified, and play it safe by assuming "is rw" for undeterminable cases.
Well, perl5 does already manage to avoid auto-vivifying hash keys when they are used as subroutine arguments. It uses magic, rather than dataflow analysis: $ cat autovivi.pl #!/usr/local/bin/perl -w use strict; use Devel::Peek; sub rval { my $a = $_[0]; } sub lval { $_[0] = undef; } sub dumpit { Dump ($_[0]); } my %a = (camel => 2); rval ($a{llama}); print "rval: @{[keys %a]}\n"; lval ($a{alpaca}); print "lval: @{[keys %a]}\n\n"; dumpit ($a{dromedary}); __END__ $ ./autovivi.pl rval: camel lval: camel alpaca SV = PVLV(0x1134d8) at 0xf4368 REFCNT = 1 FLAGS = (GMG,SMG) IV = 0 NV = 0 PV = 0 MAGIC = 0x113420 MG_VIRTUAL = &PL_vtbl_defelem MG_TYPE = PERL_MAGIC_defelem(y) MG_FLAGS = 0x02 REFCOUNTED MG_OBJ = 0xf43a4 SV = PVIV(0xf4990) at 0xf43a4 REFCNT = 1 FLAGS = (POK,pPOK) IV = 0 PV = 0x1138a0 "dromedary"\0 CUR = 9 LEN = 10 TYPE = y TARGOFF = 0 TARGLEN = 1 TARG = 0x1329ec SV = PVHV(0x114820) at 0x1329ec REFCNT = 2 FLAGS = (PADBUSY,PADMY,SHAREKEYS) IV = 2 NV = 0 ARRAY = 0x1133f8 (0:6, 1:2) hash quality = 125.0% KEYS = 2 FILL = 2 MAX = 7 RITER = -1 EITER = 0x0 Elt "camel" HASH = 0x787f96b8 SV = IV(0x112ee4) at 0xf4284 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2 Elt "alpaca" HASH = 0x5af8b041 SV = PVNV(0x12a6d8) at 0x111b40 REFCNT = 1 FLAGS = () IV = 0 NV = 0 PV = 0 As you can see, the ingredients for "magic" are quite cumbersome, but do get the job done. Nicholas Clark -- Even better than the real thing: http://nms-cgi.sourceforge.net/