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

$a = 1,,,,,,,,, #1099

Closed
p5pRT opened this issue Jan 28, 2000 · 2 comments
Closed

$a = 1,,,,,,,,, #1099

p5pRT opened this issue Jan 28, 2000 · 2 comments

Comments

@p5pRT
Copy link

p5pRT commented Jan 28, 2000

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

Searchable as RT2053$

@p5pRT
Copy link
Author

p5pRT commented Jan 28, 2000

From cook@sightpath.com

Perl fails to reject this program​:

$a = 1,,,,,,,,

The superfluous commas just seem to be ignored.

The camel says these are wrong (so I'm told; p528?)​:

print $a, if s/x/y/;
print, if s/x/y/;

Yet perl accepts them.

Perl Info


Site configuration information for perl 5.00503:

Configured by root at Mon Aug 30 23:08:56 EDT 1999.

Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
  Platform:
    osname=linux, osvers=2.2.5-22smp, archname=i386-linux
    uname='linux porky.devel.redhat.com 2.2.5-22smp #1 smp wed jun 2 09:11:51 edt 1999 i686 unknown '
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef useperlio=undef d_sfio=undef
  Compiler:
    cc='cc', optimize='-O2', gccversion=egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
    cppflags='-Dbool=char -DHAS_BOOL -I/usr/local/include'
    ccflags ='-Dbool=char -DHAS_BOOL -I/usr/local/include'
    stdchar='char', d_stdstdio=undef, usevfork=false
    intsize=4, longsize=4, ptrsize=4, doublesize=8
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    alignbytes=4, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lc -lposix -lcrypt
    libc=, so=so, useshrplib=false, libperl=libperl.a
  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 5.00503:
    /usr/lib/perl5/5.00503/i386-linux
    /usr/lib/perl5/5.00503
    /usr/lib/perl5/site_perl/5.005/i386-linux
    /usr/lib/perl5/site_perl/5.005
    .


Environment for perl 5.00503:
    HOME=/u/cook
    LANG=en_US
    LANGUAGE (unset)
    LC_ALL=en_US
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/local/cook/sonoma/bin:/u/cook/bin:/u/cook/site/linux/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/sbin:/usr/sbin
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jan 28, 2000

From @TimToady

cook@​sightpath.com writes​:
: Perl fails to reject this program​:
:
: $a = 1,,,,,,,,

It also fails to reject these​:

  $a = (1,,,,,,,,)
  $a = 1,2,3,4,5,6,7,8,9,
  $a = 1,,,,,,,,,10,

: The superfluous commas just seem to be ignored.

Yes. This is a recursive consequence of the rule that any list can end
with a comma, which is ignored. And the fact that lists don't require
parens around them unless required by precedence. So don't take the
absence of parentheses for the absence of a list.

So your example is parsing as all these sublists​:

  ($a = 1),(),(),(),(),(),(),(),()

which, after you interpolate all the null lists, is just the list

  ($a = 1)

which is, of course, no different from

  $a = 1

: The camel says these are wrong (so I'm told; p528?)​:

That's talking specifically about putting a comma between a filehandle
and subsequent arguments.

: print $a, if s/x/y/;
: print, if s/x/y/;
:
: Yet perl accepts them.

Why not? There are no filehandles there, as far as Perl is concerned.
Just a list of size 1 and a list of size 0, either of which can end
with a comma.

Actually, now that I think about it, you can't actually start a list
with a comma, so the second one is probably parsing as (print),()
rather than print((),()). In which case that's a list of size 1 as well,
the first and only element of which is the bare print operator. After all,
if you said

  print, next if s/x/y/

it would print $_ and then do a next, since next would not be considered
an argument to the print. That's why we don't allow lists to start with
a comma.

But they may certainly end with one. And since a list that ends with
a comma is a list, it can in turn end with a comma. And since a list
that ends with two commas is a list, it can in turn end with a comma.
Und so weiter...

Larry

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