Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[perl #71854] 5.10.1: for-loop scoping discrepancy with local functions (local *Foo = sub {})

5 views
Skip to first unread message

Jari Aalto

unread,
Jan 5, 2010, 7:59:07 AM1/5/10
to bugs-bi...@netlabs.develooper.com
# New Ticket Created by Jari Aalto
# Please include the string: [perl #71854]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=71854 >

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

Eric Brine

unread,
Jan 5, 2010, 2:38:07 PM1/5/10
to perl5 porters
Lexical variables aren't accessed via their name. Subs capture the variable
that is associated with the name when the sub is instantiated. This allows
for features such as module-scoped variables and closures. It's possible to
change the value of the variables, but it's always going to be the same
variable.

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.

James E Keenan via RT

unread,
Apr 4, 2015, 10:15:01 PM4/4/15
to perl5-...@perl.org
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.

--
James E Keenan (jke...@cpan.org)

---
via perlbug: queue: perl5 status: open
https://rt.perl.org/Ticket/Display.html?id=71854

Eric Brine

unread,
Apr 6, 2015, 10:15:03 AM4/6/15
to perlbug-followup, perl5 porters
On Sat, Apr 4, 2015 at 9:59 PM, James E Keenan via RT <perlbug-...@perl.org> wrote:
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.

"for $file (...)" is suppose to protect $file. I don't see a problem here. Close it.

James E Keenan via RT

unread,
Apr 6, 2015, 7:00:02 PM4/6/15
to perl5-...@perl.org
Thanks for the feedback. Resolving ticket as Rejected.
0 new messages