Front page | perl.perl5.porters |
Postings from November 2016
[perl #130038] Builtin variable for loop index in foreach
Thread Next
From:
Ed Avis
Date:
November 7, 2016 11:46
Subject:
[perl #130038] Builtin variable for loop index in foreach
Message ID:
rt-4.0.24-21706-1478519172-369.130038-75-0@perl.org
# New Ticket Created by "Ed Avis"
# Please include the string: [perl #130038]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=130038 >
This is a bug report for perl from eda@waniasset.com,
generated with the help of perlbug 1.40 running under perl 5.22.2.
-----------------------------------------------------------------
[Please describe your issue here]
Perl's foreach loop is very handy. But sometimes you write some code
where you realize you need the array index from 0 instead. So where
you had
foreach my $thing (@things) {
do_something($thing);
}
you now have to rewrite your code as
foreach my $i (0 .. $#things) {
my $thing = $things[$i];
say "processing thing number $i";
do_something($thing);
}
Moreover, to get back the original semantics (where $thing is an alias
to each item in the list) requires more code still.
I was wondering, if perl knows internally how far along in @things we
are, perhaps it could expose that list index to the programmer? This
would be both more concise and more efficient, and avoid the need to
rewrite code when it turns out you do want the index after all.
Suppose that the currently unused $# variable were used for this.
Then you could write
foreach my $thing (@things) {
say "processing thing number $#";
do_something($thing);
}
There are snags with this (even assuming it could be implemented with
little work). The $# variable would get set to the array index
applying to the foreach loop you are currently inside. If having
nested loops the programmer would have to be a bit careful, or else
fall back to doing it the longhand way with an $i variable. But this
problem has already been addressed with the default $_ used in foreach:
foreach (qw(a b c)) { say $_; foreach (qw(x y z)) { say $_ } say $_ }
and I imagine a similar rule could apply to $#.
I suggest this new feature because I hope it is something perl already
knows and can expose to the programmer. If so, it would be a useful
enhancement to the language. If implementing it would be more
difficult, obviously the perl5-porters may feel there are better
things to work on. Thanks for considering it.
[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=core
severity=wishlist
---
Site configuration information for perl 5.22.2:
Configured by Red Hat, Inc. at Wed Aug 3 14:06:20 UTC 2016.
Summary of my perl5 (revision 5 version 22 subversion 2) configuration:
Platform:
osname=linux, osvers=4.6.3-300.fc24.x86_64, archname=x86_64-linux-thread-multi
uname='linux buildvm-08.phx2.fedoraproject.org 4.6.3-300.fc24.x86_64 #1 smp fri jun 24 20:52:41 utc 2016 x86_64 x86_64 x86_64 gnulinux '
config_args='-des -Doptimize=none -Dccflags=-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Dldflags=-Wl,-z,relro -Dccdlflags=-Wl,--enable-new-dtags -Wl,-z,relro -Dlddlflags=-shared -Wl,-z,relro -Dshrpdir=/usr/lib64 -DDEBUGGING=-g -Dversion=5.22.2 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5 -Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5/vendor_perl -Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5/vendor_perl -Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Duseshrplib -Dusethreads -Duseithreads -Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallu
srbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin -Dusesitecustomize'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize=' -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include'
ccversion='', gccversion='5.3.1 20160406 (Red Hat 5.3.1-6)', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678, doublekind=3
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16, longdblkind=3
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='gcc', ldflags ='-Wl,-z,relro -fstack-protector-strong -L/usr/local/lib'
libpth=/usr/local/lib64 /lib64 /usr/lib64 /usr/local/lib /usr/lib /lib/../lib64 /usr/lib/../lib64 /lib
libs=-lpthread -lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lc -lgdbm_compat
perllibs=-lpthread -lresolv -lnsl -ldl -lm -lcrypt -lutil -lc
libc=libc-2.22.so, so=so, useshrplib=true, libperl=libperl.so
gnulibc_version='2.22'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,--enable-new-dtags -Wl,-z,relro '
cccdlflags='-fPIC', lddlflags='-shared -Wl,-z,relro -L/usr/local/lib -fstack-protector-strong'
Locally applied patches:
Fedora Patch1: Removes date check, Fedora/RHEL specific
Fedora Patch3: support for libdir64
Fedora Patch4: use libresolv instead of libbind
Fedora Patch5: USE_MM_LD_RUN_PATH
Fedora Patch6: Skip hostname tests, due to builders not being network capable
Fedora Patch7: Dont run one io test due to random builder failures
Fedora Patch15: Define SONAME for libperl.so
Fedora Patch16: Install libperl.so to -Dshrpdir value
Fedora Patch22: Document Math::BigInt::CalcEmu requires Math::BigInt (CPAN RT#85015)
Fedora Patch26: Make *DBM_File desctructors thread-safe (RT#61912)
Fedora Patch27: Make PadlistNAMES() lvalue again (CPAN RT#101063)
Fedora Patch28: Make magic vtable writable as a work-around for Coro (CPAN RT#101063)
Fedora Patch29: Fix duplicating PerlIO::encoding when spawning threads (RT#31923)
Fedora Patch30: Do not let XSLoader load relative paths (CVE-2016-6185)
Fedora Patch31: Avoid loading optional modules from default . (CVE-2016-1238)
Fedora Patch200: Link XS modules to libperl.so with EU::CBuilder on Linux
Fedora Patch201: Link XS modules to libperl.so with EU::MM on Linux
---
@INC for perl 5.22.2:
/home/eda/lib64/perl5/
/usr/local/lib64/perl5
/usr/local/share/perl5
/usr/lib64/perl5/vendor_perl
/usr/share/perl5/vendor_perl
/usr/lib64/perl5
/usr/share/perl5
---
Environment for perl 5.22.2:
HOME=/home/eda
LANG=en_GB.UTF-8
LANGUAGE (unset)
LC_COLLATE=C
LC_CTYPE=en_GB.UTF-8
LC_MESSAGES=en_GB.UTF-8
LC_MONETARY=en_GB.UTF-8
LC_NUMERIC=en_GB.UTF-8
LC_TIME=en_GB.UTF-8
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/eda/bin:/home/eda/bin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/sbin:/usr/sbin
PERL5LIB=/home/eda/lib64/perl5/
PERL_BADLANG (unset)
SHELL=/bin/bash
Thread Next
-
[perl #130038] Builtin variable for loop index in foreach
by Ed Avis