Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Possible documentation incompleteness or bug in the range operator on undef #7000

Closed
p5pRT opened this issue Dec 22, 2003 · 3 comments
Closed

Comments

@p5pRT
Copy link

p5pRT commented Dec 22, 2003

Migrated from rt.perl.org#24735 (status was 'resolved')

Searchable as RT24735$

@p5pRT
Copy link
Author

p5pRT commented Dec 22, 2003

From perl-5.8.0@ton.iguana.be

Created by perl-5.8.0@ton.iguana.be

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

Perl Info

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

@p5pRT
Copy link
Author

p5pRT commented Dec 27, 2003

From @rgs

perl-5.8.0@​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

@p5pRT
Copy link
Author

p5pRT commented Dec 27, 2003

@rgs - Status changed from 'new' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant