Perl / perl5

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

for(@a) optimisation causes problems #10436

Open p5pRT opened 14 years ago

p5pRT commented 14 years ago

Migrated from rt.perl.org#75720 (status was 'stalled')

Searchable as RT75720$

p5pRT commented 14 years ago

From @cpansprout

$ 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

p5pRT commented 14 years ago

From @iabyn

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

p5pRT commented 14 years ago

The RT System itself - Status changed from 'new' to 'open'

p5pRT commented 14 years ago

From @cowens

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.

p5pRT commented 14 years ago

@iabyn - Status changed from 'open' to 'stalled'