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

[perl #24735] Possible documentation incompleteness or bug in the range operator on undef

0 views
Skip to first unread message

perlbug-...@perl.org

unread,
Dec 22, 2003, 2:29:12 PM12/22/03
to bugs-bi...@netlabs.develooper.com
# New Ticket Created by perl-...@ton.iguana.be
# Please include the string: [perl #24735]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=24735 >

rl This is a bug report for perl from perl-...@ton.iguana.be,
generated with the help of perlbug 1.34 running under perl v5.8.0.


-----------------------------------------------------------------
[Please enter your report here]

This is expected:
perl -le '$to=""; @a="B"..$to; print "<@a>"'
<>

.. is supposed to magic increment B until it's longer than
the endvalue ("", which is not in the range). Since this is
so already for the first value, you get the empty list. Good.

This was unexpected:
perl -le '$to=undef; @a="B"..$to; print "<@a>"'
<0>
What I suppose is happening here is that not *both* operands are
strings, and so it's doing a numeric .., and B and undef in a
numeric context are both 0, so I'm really doing 0..0 and get 0.

But why is it seeing undef as the number 0 and not the string
"" ? In other operators that change behaviour as soon as *one* of the
arguments is a number, like |, undef actually behaves like a string:

perl -le '$to=undef;print "B"|$to'
B

[Please do not change anything below this line]
-----------------------------------------------------------------
---
Flags:
category=core
severity=low
---
Site configuration information for perl v5.8.0:

Configured by ton at Tue Nov 12 01:56:18 CET 2002.

Summary of my perl5 (revision 5.0 version 8 subversion 0) configuration:
Platform:
osname=linux, osvers=2.4.19, archname=i686-linux-thread-multi-64int-ld
uname='linux quasar 2.4.19 #5 wed oct 2 02:34:25 cest 2002 i686 unknown '
config_args=''
hint=recommended, useposix=true, d_sigaction=define
usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=define use64bitall=undef uselongdouble=define
usemymalloc=y, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -fomit-frame-pointer',
cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -I/usr/local/include'
ccversion='', gccversion='2.95.3 20010315 (release)', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
ivtype='long long', ivsize=8, nvtype='long double', nvsize=12, Off_t='off_t', lseeksize=8
alignbytes=4, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib
libs=-lnsl -lndbm -ldb -ldl -lm -lpthread -lc -lposix -lcrypt -lutil
perllibs=-lnsl -ldl -lm -lpthread -lc -lposix -lcrypt -lutil
libc=/lib/libc-2.2.4.so, so=so, useshrplib=false, libperl=libperl.a
gnulibc_version='2.2.4'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
cccdlflags='-fpic', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:

---
@INC for perl v5.8.0:
/usr/lib/perl5/5.8.0/i686-linux-thread-multi-64int-ld
/usr/lib/perl5/5.8.0
/usr/lib/perl5/site_perl/5.8.0/i686-linux-thread-multi-64int-ld
/usr/lib/perl5/site_perl/5.8.0
/usr/lib/perl5/site_perl
.

---
Environment for perl v5.8.0:
HOME=/home/ton
LANG (unset)
LANGUAGE (unset)
LD_LIBRARY_PATH (unset)
LOGDIR (unset)
PATH=/home/ton/bin.Linux:/home/ton/bin:/home/ton/bin.SampleSetup:/usr/local/bin:/usr/local/sbin:/usr/local/jre/bin:/home/oracle/product/9.0.1/bin:/usr/local/ar/bin:/usr/games/bin:/usr/X11R6/bin:/usr/share/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PERL_BADLANG (unset)
SHELL=/bin/bash

Rafael Garcia-Suarez

unread,
Dec 27, 2003, 4:54:24 PM12/27/03
to perl5-...@perl.org
perl-...@ton.iguana.be (via RT) wrote:
> This is expected:
> perl -le '$to=""; @a="B"..$to; print "<@a>"'
> <>
>
> .. is supposed to magic increment B until it's longer than
> the endvalue ("", which is not in the range). Since this is
> so already for the first value, you get the empty list. Good.
>
> This was unexpected:
> perl -le '$to=undef; @a="B"..$to; print "<@a>"'
> <0>
> What I suppose is happening here is that not *both* operands are
> strings, and so it's doing a numeric .., and B and undef in a
> numeric context are both 0, so I'm really doing 0..0 and get 0.
>
> But why is it seeing undef as the number 0 and not the string
> "" ?

I applied the following fix :

Change 21983 by rgs@rgs-home on 2003/12/27 21:29:04

Fix bug [perl #24735] : make sure that the range (..) operator
treats an undefined argument as 0 for numerical ranges and as ""
for magical string ranges.

Affected files ...

... //depot/perl/pp_ctl.c#376 edit
... //depot/perl/t/op/range.t#12 edit

0 new messages