Open p5pRT opened 14 years ago
$ perl -le' @a = (1\,2\,3); print shift @a for @a' 1 2
$ perl -le' @a = (1\,2\,3); print shift @a for ()\,@a' 1 2 3
There seems to be some optimisation for ‘for @array’ that has strange
side-effects.
This can sometimes cause action-at-a-distance: $node = ... expr returning an XML::DOM::Lite::Node $node->removeChild($_) for @{ $node->childNodes };
And\, apparently\, I’m not the only person to have run into this. I
stumbled across this In Silki::Web::Form 0.08 today:
sub _collapse_single_option_selects { my $self = shift;
my @to_collapse; for my $select ( @{ $self->_dom()->getElementsByTagName ('select') } ) { next if $select->id() =~ /^wpms-/;
my @options = $select->options();
next if @options != 1;
push @to_collapse\, [ $select\, $options[0] ]; }
# Modifying the dom as we loop through it seems to cause weirdness # where some select elements get skipped. $self->_collapse_single_option_select( @{$_} ) for @to_collapse; }
See that comment. A simple ‘for my $select( ()\, @{...} )’ would have
worked around the problem.
Use of uninitialized value $category in concatenation (.) or string
at /usr/local/bin/perlbug5.13.1 line 645.
Use of uninitialized value $severity in concatenation (.) or string
at /usr/local/bin/perlbug5.13.1 line 645.
Flags: category=core severity=low
Site configuration information for perl 5.13.1:
Configured by sprout at Sun Jun 6 14:31:27 PDT 2010.
Summary of my perl5 (revision 5 version 13 subversion 1 patch
v5.13.1-149-g6dd2be5) configuration:
Snapshot of: 6dd2be570d715119e05672f6f0266d924022b65a
Platform:
osname=darwin\, osvers=10.0.0\, archname=darwin-2level
uname='darwin pint.local 10.0.0 darwin kernel version 10.0.0: fri
jul 31 22:47:34 pdt 2009; root:xnu-1456.1.25~1release_i386 i386 '
config_args='-de -Dusedevel'
hint=recommended\, useposix=true\, d_sigaction=define
useithreads=undef\, usemultiplicity=undef
useperlio=define\, d_sfio=undef\, uselargefiles=define\,
usesocks=undef
use64bitint=undef\, use64bitall=undef\, uselongdouble=undef
usemymalloc=n\, bincompat5005=undef
Compiler:
cc='cc'\, ccflags ='-fno-common -DPERL_DARWIN -no-cpp-precomp -fno-
strict-aliasing -pipe -fstack-protector -I/usr/local/include'\,
optimize='-O3'\,
cppflags='-no-cpp-precomp -fno-common -DPERL_DARWIN -no-cpp-
precomp -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/
include'
ccversion=''\, gccversion='4.2.1 (Apple Inc. build 5646)'\,
gccosandvers=''
intsize=4\, longsize=4\, ptrsize=4\, doublesize=8\, byteorder=1234
d_longlong=define\, longlongsize=8\, d_longdbl=define\, longdblsize=16
ivtype='long'\, ivsize=4\, nvtype='double'\, nvsize=8\,
Off_t='off_t'\, lseeksize=8
alignbytes=8\, prototype=define
Linker and Libraries:
ld='env MACOSX_DEPLOYMENT_TARGET=10.3 cc'\, ldflags =' -fstack-
protector -L/usr/local/lib'
libpth=/usr/local/lib /usr/lib
libs=-ldbm -ldl -lm -lutil -lc
perllibs=-ldl -lm -lutil -lc
libc=/usr/lib/libc.dylib\, so=dylib\, useshrplib=false\,
libperl=libperl.a
gnulibc_version=''
Dynamic Linking:
dlsrc=dl_dlopen.xs\, dlext=bundle\, d_dlsymun=undef\, ccdlflags=' '
cccdlflags=' '\, lddlflags=' -bundle -undefined dynamic_lookup -L/
usr/local/lib -fstack-protector'
Locally applied patches:
@INC for perl 5.13.1: /usr/local/lib/perl5/site_perl/5.13.1/darwin-2level /usr/local/lib/perl5/site_perl/5.13.1 /usr/local/lib/perl5/5.13.1/darwin-2level /usr/local/lib/perl5/5.13.1 /usr/local/lib/perl5/site_perl .
Environment for perl 5.13.1: DYLD_LIBRARY_PATH (unset) HOME=/Users/sprout LANG=en_US.UTF-8 LANGUAGE (unset) LD_LIBRARY_PATH (unset) LOGDIR (unset) PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/ usr/local/bin PERL_BADLANG (unset) SHELL=/bin/bash
On Sun\, Jun 13\, 2010 at 06:23:30PM -0700\, Father Chrysostomos wrote:
$ perl -le' @a = (1\,2\,3); print shift @a for @a' 1 2
$ perl -le' @a = (1\,2\,3); print shift @a for ()\,@a' 1 2 3
There seems to be some optimisation for ‘for @array’ that has strange
side-effects.
The first one iterates over the elements of an array\, the second over the elements of a list. The array is being modified mid-iteration\, while the list isn't\, which is why you see different results.
-- Atheism is a religion like not collecting stamps is a hobby
The RT System itself - Status changed from 'new' to 'open'
On Sun\, Jun 13\, 2010 at 21:23\, Father Chrysostomos \perlbug\-followup@​perl\.org wrote: snip
$ perl -le' @a = (1\,2\,3); print shift @a for @a' 1 2 snip
This a documented as a bad thing to do in [perlsyn][1]:
If any part of LIST is an array\, foreach will get very confused if you add or remove elements within the loop body\, for example with splice. So don't do that.
[1] : http://perldoc.perl.org/perlsyn.html#Foreach-Loops
-- Chas. Owens wonkden.net The most important skill a programmer can have is the ability to read.
@iabyn - Status changed from 'open' to 'stalled'
Migrated from rt.perl.org#75720 (status was 'stalled')
Searchable as RT75720$