DESCRIPTION
If variable is defined before sub, the $file variable should be seen. It
apperas that for-loop somehow alters the scope, although the loop
variable is defined *before* the for-loop.
TEST RESULTS
The $FILE variable, when assigned is seen in sub.
The $file variable, when not in for loop, when assigned is seen in sub.
But when inside for loop, the $file is not seen in sub. Function
Print() displays´empty for $file inside loop.
TEST CASE
my ($file, $FILE);
sub Print;
local *Print = sub
{
print "FILE: ", $file, @_, "\n";
};
sub Print2;
local *Print2 = sub
{
print "FILE2: ", $FILE, @_, "\n";
};
$file = "print";
Print; # Works, reads $file
$file = "";
for $file ( qw(1 2 3))
{
Print; # fails, does not read $file
$FILE = $file;
Print2; # Works, reads $FILE
}
-----------------------------------------------------------------------
[perbug -d output]
Flags:
category=
severity=
---
Site configuration information for perl 5.10.1:
Configured by Debian Project at Sat Nov 21 19:18:01 UTC 2009.
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
Platform:
osname=linux, osvers=2.6.31-1-amd64, archname=x86_64-linux-gnu-thread-multi
uname='linux madeleine 2.6.31-1-amd64 #1 smp mon nov 16 04:44:38 utc 2009 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.1 -Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
ccversion='', gccversion='4.3.4', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.10.1.so, so=so, useshrplib=true, libperl=libperl.so.5.10.1
gnulibc_version='2.10.1'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib -fstack-protector'
Locally applied patches:
---
@INC for perl 5.10.1:
/etc/perl
/usr/local/lib/perl/5.10.1
/usr/local/share/perl/5.10.1
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.
---
Environment for perl 5.10.1:
HOME=/home/jaalto
LANG=en_DK.UTF-8
LANGUAGE (unset)
LC_NUMERIC=C
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/jaalto/var/link/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
PERL_BADLANG (unset)
SHELL=/bin/bash
As documented, foreach loops localise their iterator variable. That means
they temporarily associate a new variable with the variable name. If a sub
captured the variable previously associated with the name, it will continue
to see the variable it captured, and it will be protected from what happens
in the foreach loop.
If I understand your post correctly, there's no bug in Perl here, just a misunderstanding of some subtle points about variable and subroutine scope.
Is that correct?
If so, then I recommend we close this 5-year-old ticket.
Thank you very much.