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

sort CONSTANT exhibits weird behavior #7979

Open
p5pRT opened this issue Jun 19, 2005 · 4 comments
Open

sort CONSTANT exhibits weird behavior #7979

p5pRT opened this issue Jun 19, 2005 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Jun 19, 2005

Migrated from rt.perl.org#36333 (status was 'open')

Searchable as RT36333$

@p5pRT
Copy link
Author

p5pRT commented Jun 19, 2005

From @fbriere

Created by @fbriere

  $ perl -le 'use constant NUMBERS => qw(one two three); print sort NUMBERS'
  NUMBERS

  $ perl -le 'use constant NUMBERS => qw(one two three); print sort NUMBERS()'

  $ perl -le 'use constant NUMBERS => qw(one two three); print sort (NUMBERS)'
  NUMBERS

  $ perl -le 'use constant NUMBERS => qw(one two three); print sort (NUMBERS())'
  onethreetwo

(I imagine case #2 is related to ticket #30377.)

Perl Info

Flags:
    category=core
    severity=low

Site configuration information for perl v5.8.7:

Configured by Debian Project at Thu Jun  9 00:28:22 EST 2005.

Summary of my perl5 (revision 5 version 8 subversion 7) configuration:
  Platform:
    osname=linux, osvers=2.4.27-ti1211, archname=i386-linux-thread-multi
    uname='linux kosh 2.4.27-ti1211 #1 sun sep 19 18:17:45 est 2004 i686 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i386-linux -Dprefix=/usr -Dprivlib=/usr/share/perl/5.8 -Darchlib=/usr/lib/perl/5.8 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.8.7 -Dsitearch=/usr/local/lib/perl/5.8.7 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Uusesfio -Uusenm -Duseshrplib -Dlibperl=libperl.so.5.8.7 -Dd_dosuid -des'
    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=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DTHREADS_HAVE_PIDS -DDEBIAN -fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='3.3.6 (Debian 1:3.3.6-6)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, 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=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.3.2.so, so=so, useshrplib=true, libperl=libperl.so.5.8.7
    gnulibc_version='2.3.2'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:
    


@INC for perl v5.8.7:
    /etc/perl
    /usr/local/lib/perl/5.8.7
    /usr/local/share/perl/5.8.7
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.8
    /usr/share/perl/5.8
    /usr/local/lib/site_perl
    /usr/local/share/perl/5.8.0
    .


Environment for perl v5.8.7:
    HOME=/home/fbriere
    LANG=en_CA
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:.
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jul 8, 2016

From @dcollinsn

dcollins@​nightshade64​:~/toolchain$ perl5.25.2 -MO=Deparse -le 'use constant NUMBERS => qw(one two three); print sort NUMBERS;'
BEGIN { $/ = "\n"; $\ = "\n"; }
use constant ('NUMBERS', ('one', 'two', 'three'));
print sort('NUMBERS');
-e syntax OK
dcollins@​nightshade64​:~/toolchain$ perl5.25.2 -MO=Deparse -le 'use constant NUMBERS => qw(one two three); print sort NUMBERS();'
BEGIN { $/ = "\n"; $\ = "\n"; }
use constant ('NUMBERS', ('one', 'two', 'three'));
print((sort NUMBERS ()));
-e syntax OK
dcollins@​nightshade64​:~/toolchain$ perl5.25.2 -MO=Deparse -le 'use constant NUMBERS => qw(one two three); print sort (NUMBERS);'
BEGIN { $/ = "\n"; $\ = "\n"; }
use constant ('NUMBERS', ('one', 'two', 'three'));
print sort('NUMBERS');
-e syntax OK
dcollins@​nightshade64​:~/toolchain$ perl5.25.2 -MO=Deparse -le 'use constant NUMBERS => qw(one two three); print sort (NUMBERS());'
BEGIN { $/ = "\n"; $\ = "\n"; }
use constant ('NUMBERS', ('one', 'two', 'three'));
print sort(('one', 'two', 'three'));
-e syntax OK

It's being interpreted as a bareword for some reason?

@p5pRT
Copy link
Author

p5pRT commented Jul 8, 2016

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

@p5pRT
Copy link
Author

p5pRT commented Jul 8, 2016

From @cpansprout

On Thu Jul 07 17​:58​:18 2016, dcollinsn@​gmail.com wrote​:

It's being interpreted as a bareword for some reason?

Oh, what fun! This is a very old bug. And it occurs because of the way that the parser gets to decide whether the first token after ‘sort’ is a comparison sub or part of the list to sort.

The lexer (toke.c) assumes that any word immediately following ‘sort’ is a comparison sub, which gets emitted as a WORD token, just like a bareword.

It is the parser (perly.y) that distinguishes between these two​:

  sort foo bar
  sort foo,bar

So the lexer does not actually know at the time whether the word will be a comparator or not. That makes it hard to fix.

(All of this is from memory. I may be getting some of it wrong.)

use constant{Just=>another=>Perl=>hacker=>};$\=",\n";
print join" ",map eval"sort $_,$_",qw! Just Perl!

--

Father Chrysostomos

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

2 participants