Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.93k stars 552 forks source link

Use of uninialised variable on tied hashed, but not untied hashes. #1880

Closed p5pRT closed 21 years ago

p5pRT commented 24 years ago

Migrated from rt.perl.org#3148 (status was 'resolved')

Searchable as RT3148$

p5pRT commented 24 years ago

From mike@fysh.org

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

p5pRT commented 24 years ago

From [Unknown Contact. See original ticket]

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

p5pRT commented 24 years ago

From [Unknown Contact. See original ticket]

#!/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

p5pRT commented 21 years ago

From @ask

Not a bug.

-- ask bjoern hansen\, http​://askbjoernhansen.com/ !try; do(); Develooper LLC\, http​://develooper.com/ $stuff->better;

p5pRT commented 21 years ago

@ask - Status changed from 'open' to 'resolved'