Closed p5pRT closed 21 years ago
This is a bug report for perl from mike@fysh.org\, generated with the help of perlbug 1.26 running under perl 5.00503.
The following code does not generate a warning:
#!/usr/bin/perl -w
$cheese{"cake"}=undef;
However\, the following code does:
#!/usr/bin/perl -w
use DB_File;
tie %cheese\, 'DB_File'\, "fred";
$cheese{"cake"}=undef;
I get a "Use of uninitalized variable" warning\, which is a shame\, because it makes -w unusable in my particular case (I'm creating millions of undefined hash elements). The 'exists' versus 'defined' functionality appears to be working correctly; it's the superfluous warning that causes me a problem.
Cheers\, Mike.
Site configuration information for perl 5.00503:
Configured by torin at Mon Mar 27 07:50:39 PST 2000.
Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration: Platform: osname=linux\, osvers=2.2.14\, archname=i386-linux uname='linux perv 2.2.14 #1 sat jan 15 20:48:59 pst 2000 i686 unknown ' hint=recommended\, useposix=true\, d_sigaction=define usethreads=undef useperlio=undef d_sfio=undef Compiler: cc='cc'\, optimize='-O2 '\, gccversion=2.95.2 20000220 (Debian GNU/Linux) cppflags='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include' ccflags ='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include' stdchar='char'\, d_stdstdio=undef\, usevfork=false intsize=4\, longsize=4\, ptrsize=4\, doublesize=8 d_longlong=define\, longlongsize=8\, d_longdbl=define\, longdblsize=12 alignbytes=4\, usemymalloc=n\, prototype=define Linker and Libraries: ld='cc'\, ldflags =' -L/usr/local/lib' libpth=/usr/local/lib /lib /usr/lib libs=-lnsl -lndbm -lgdbm -ldbm -ldb -ldl -lm -lc -lposix -lcrypt libc=\, so=so\, useshrplib=false\, libperl=libperl.a Dynamic Linking: dlsrc=dl_dlopen.xs\, dlext=so\, d_dlsymun=undef\, ccdlflags='-rdynamic' cccdlflags='-fPIC'\, lddlflags='-shared -L/usr/local/lib'
Locally applied patches:
@INC for perl 5.00503: /usr/lib/perl5/5.005/i386-linux /usr/lib/perl5/5.005 /usr/local/lib/site_perl/i386-linux /usr/local/lib/site_perl /usr/lib/perl5 .
Environment for perl 5.00503: HOME=/home/mike LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/home/mike/bin/:/usr/local/bin:/usr/bin/:/bin/:/usr/bin/X11:/usr/openwin/bin/xview:/usr/openwin/bin:/usr/ucb:/usr/etc:/usr/local/bin:/diskB/local/tran/bin:/usr/local/java/bin/:/usr/local/lib/xemacs/site-lisp/tm/methods:/usr/local/teTeX/bin:/usr/local/netpbm-bin/bin:/usr/lib/teTeX/bin PERL_BADLANG (unset) SHELL=/usr/bin/zsh
Mike Ashton \mike@​fysh\.org wrote
use DB_File;
tie %cheese\, 'DB_File'\, "fred";
$cheese{"cake"}=undef;
That doesn't work. DB_File only supports strings as hash values\, not undef or references or ... . This reflects a limitation of the underlying Berkeley DB.
I get a "Use of uninitalized variable" warning\, which is a shame\, because it makes -w unusable in my particular case (I'm creating millions of undefined hash elements).
To avoid the warning\, write instead
$cheese{"cake"}='';
If you really need to distinguish between undef and ''\, you're out of luck. You'll need to redesign your data representation.
Mike Guy
#!/usr/bin/perl -w use DB_File; tie %cheese\, 'DB_File'\, "fred"; $cheese{"cake"}=undef;
I get a "Use of uninitalized variable" warning\, ...
Just how do you expect DB_File to store undef in a file?
For both in-memory and on-disk hashes\, a give key will exist or not exist. For in-memory hashes\, the value can be the null string\, a non-null string\, or undef. For on-disk hashes\, the value can be null or non-null.
The docs for DB_File say nothing about the ability to store a value of undef (as opposed to "" which is a defined() value). My guess is that the warnings you are seeing are the result of DB_File converting the value of undef to "" when the key & value are stored on disk. -Joe
Not a bug.
-- ask bjoern hansen\, http://askbjoernhansen.com/ !try; do(); Develooper LLC\, http://develooper.com/ $stuff->better;
@ask - Status changed from 'open' to 'resolved'
Migrated from rt.perl.org#3148 (status was 'resolved')
Searchable as RT3148$