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

my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) #10234

Closed
p5pRT opened this issue Mar 15, 2010 · 9 comments
Closed

Comments

@p5pRT
Copy link

p5pRT commented Mar 15, 2010

Migrated from rt.perl.org#73570 (status was 'rejected')

Searchable as RT73570$

@p5pRT
Copy link
Author

p5pRT commented Mar 15, 2010

From @apocalypse

Created by @apocalypse

While helping David Golden iron out bugs in the CPANTesters 2.0 code I
stumbled
across this bug in Metabase​::Resource​::cpan​::distfile. Thanks to the
help from
various people in IRC, we've tracked it down to this commit​:

<+p5changes> Commit #a62b51b8(/Shinya Hayakawa)​: Re​: my $x->{foo}
doesn't work http​://perl5.git.perl.org/perl.git/commit/a62b51b8

The bug is not that this "feature" should be removed. The bug is that
the behavior
is not documented anywhere. I checked perl5100delta.pod and perlsub.pod
and no
reference was made regarding this new syntax. Hopefully someone can look
closer at
the docs and see if it's actually noted somewhere and make it more
obvious. Or, please
feel free to kick my butt if it's there somewhere - I apologize for
being tired today...

Note​: <xdg> perl/t/op/my.t has this line​: ++my $x->{foo};
The perl testsuite already tests for this, I didn't know about it and
made this crappy test :)

Note2​: You can do "ack 'my\s+\$\w+->\{' yourcode/" to find this syntax...

[cpan@​ubuntu-server64 ~]$ cat testsyntax.pl
use strict; use warnings;
use Data​::Dumper;

my $string = "foo";
my $cache->{dist_file} = $string;

print Dumper( $cache );
[cpan@​ubuntu-server64 ~]$ perl testsyntax.pl
$VAR1 = {
  'dist_file' => 'foo'
  };
[cpan@​ubuntu-server64 ~]$ perl -v

This is perl, v5.10.0 built for x86_64-linux-gnu-thread-multi

Copyright 1987-2007, Larry Wall

Perl may be copied only under the terms of either the Artistic License
or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http​://www.perl.org/, the Perl Home Page.

[cpan@​ubuntu-server64 ~]$ perls/perl-5.8.9-default/bin/perl testsyntax.pl
Can't use an undefined value as a HASH reference at testsyntax.pl line 5.
[cpan@​ubuntu-server64 ~]$ perls/perl-5.8.9-default/bin/perl -v

This is perl, v5.8.9 built for x86_64-linux

Copyright 1987-2008, Larry Wall

Perl may be copied only under the terms of either the Artistic License
or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http​://www.perl.org/, the Perl Home Page.

[cpan@​ubuntu-server64 ~]$ cat testsyntax2.pl
use strict; use warnings;
use Data​::Dumper;

my $string = "foo";
my $cache = { dist_file => $string };

print Dumper( $cache );
[cpan@​ubuntu-server64 ~]$ perl testsyntax2.pl
$VAR1 = {
  'dist_file' => 'foo'
  };
[cpan@​ubuntu-server64 ~]$ perls/perl-5.8.9-default/bin/perl testsyntax2.pl
$VAR1 = {
  'dist_file' => 'foo'
  };

Perl Info

Flags:
    category=core
    severity=medium

Site configuration information for perl 5.10.0:

Configured by Debian Project at Thu Oct  1 22:36:47 UTC 2009.

Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.6.24-23-server, 
archname=x86_64-linux-gnu-thread-multi
    uname='linux crested 2.6.24-23-server #1 smp wed apr 1 22:14:30 utc 
2009 x86_64 gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN 
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr 
-Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local 
-Dsitelib=/usr/local/share/perl/5.10.0 
-Dsitearch=/usr/local/lib/perl/5.10.0 -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 -Ud_ualarm -Uusesfio 
-Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib 
-Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN 
-fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE 
-D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing 
-pipe -I/usr/local/include'
    ccversion='', gccversion='4.4.1', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', 
lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64
    libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
    perllibs=-ldl -lm -lpthread -lc -lcrypt
    libc=/lib/libc-2.10.1.so, so=so, useshrplib=true, 
libperl=libperl.so.5.10.0
    gnulibc_version='2.10.1'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib'

Locally applied patches:
    


@INC for perl 5.10.0:
    /etc/perl
    /usr/local/lib/perl/5.10.0
    /usr/local/share/perl/5.10.0
    /usr/lib/perl5
    /usr/share/perl5
    /usr/lib/perl/5.10
    /usr/share/perl/5.10
    /usr/local/lib/site_perl
    .


Environment for perl 5.10.0:
    HOME=/home/apoc
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @ikegami

On Mon, Mar 15, 2010 at 3​:11 AM, perl@​0ne.us <perlbug-followup@​perl.org>wrote​:

# New Ticket Created by "perl@​0ne.us"
# Please include the string​: [perl #73570]
# in the subject line of all future correspondence about this issue.
# <URL​: http​://rt.perl.org/rt3/Ticket/Display.html?id=73570 >

my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional
change?

The syntax was valid before.

c​:\progs\perl589\bin\perl -c -e"my $foo->{foo} = $bar"
-e syntax OK

The difference is that my $foo wasn't treated as an lvalue before 5.10.

c​:\progs\perl589\bin\perl -e"my $foo->{foo} = $bar"
Can't use an undefined value as a HASH reference at -e line 1.

The bug is not that this "feature" should be removed. The bug is that
the behavior is not documented anywhere.

Autovivification is documented in perlref. It is also mentioned in perldata.

I checked perl5100delta.pod and perlsub.pod
and no reference was made regarding this new syntax.

Syntax wasn't changed.

I don't see any mention of the bug fix, but not all bug fixes are listed.

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

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

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @ikegami

On Mon, Mar 15, 2010 at 3​:11 AM, perl@​0ne.us <perlbug-followup@​perl.org>wrote​:

# New Ticket Created by "perl@​0ne.us"
# Please include the string​: [perl #73570]
# in the subject line of all future correspondence about this issue.
# <URL​: http​://rt.perl.org/rt3/Ticket/Display.html?id=73570 >

my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional

change? )

The fix was intentional​:

http​://perl5.git.perl.org/perl.git/commitdiff/a62b51b8b5ba4453033358d44b4729c019d6ae42

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @demerphq

On 16 March 2010 18​:39, Eric Brine <ikegami@​adaelis.com> wrote​:

On Mon, Mar 15, 2010 at 3​:11 AM, perl@​0ne.us <perlbug-followup@​perl.org>wrote​:

# New Ticket Created by  "perl@​0ne.us"
# Please include the string​:  [perl #73570]
# in the subject line of all future correspondence about this issue.
# <URL​: http​://rt.perl.org/rt3/Ticket/Display.html?id=73570 >

my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional

change? )

The fix was intentional​:

http​://perl5.git.perl.org/perl.git/commitdiff/a62b51b8b5ba4453033358d44b4729c019d6ae42

Except that the syntax in the commit message and here is subtly but
importantly different.

(my $x)->{foo}

is not really the same thing as

my $x->{foo}

is it?

Yves

--
perl -Mre=debug -e "/just|another|perl|hacker/"

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @jandubois

On Tue, 16 Mar 2010, demerphq wrote​:

On 16 March 2010 18​:39, Eric Brine <ikegami@​adaelis.com> wrote​:

The fix was intentional​:

http​://perl5.git.perl.org/perl.git/commitdiff/a62b51b8b5ba4453033358d44b4729c019d6ae42

Except that the syntax in the commit message and here is subtly but
importantly different.

(my $x)->{foo}

is not really the same thing as

my $x->{foo}

is it?

What else could it be? my() works on names, not expressions.

Not that I like this particular example; I would always write it as​:

  my $x = { foo => "bar" };

Cheers,
-Jan

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @ikegami

On Tue, Mar 16, 2010 at 2​:20 PM, demerphq <demerphq@​gmail.com> wrote​:

(my $x)->{foo}
is not really the same thing as
my $x->{foo}
is it?

Yes. (Deparse is buggy, so using Concise)

perl589\bin\perl -MO=Concise -e"my $x->{foo}"
7 <@​> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e​:1) v ->3
6 <2> helem vK/2 ->7
4 <1> rv2hv[t2] sKR/1 ->5
3 <0> padsv[$x​:1,2] sM/LVINTRO,DREFHV ->4
5 <$> const[PV "foo"] s/BARE ->6
-e syntax OK

perl589\bin\perl -MO=Concise -e"(my $x)->{foo}"
7 <@​> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e​:1) v ->3
6 <2> helem vK/2 ->7
4 <1> rv2hv[t2] sKR/1 ->5
3 <0> padsv[$x​:1,2] sPM/LVINTRO,DREFHV ->4
5 <$> const[PV "foo"] s/BARE ->6
-e syntax OK

perl5101\bin\perl -MO=Concise -e"my $x->{foo}"
7 <@​> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e​:1) v​:{ ->3
6 <2> helem vK/2 ->7
4 <1> rv2hv[t2] sKR/1 ->5
3 <0> padsv[$x​:1,2] sM/LVINTRO,DREFHV ->4
5 <$> const[PV "foo"] s/BARE ->6
-e syntax OK

perl5101\bin\perl -MO=Concise -e"(my $x)->{foo}"
7 <@​> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e​:1) v​:{ ->3
6 <2> helem vK/2 ->7
4 <1> rv2hv[t2] sKR/1 ->5
3 <0> padsv[$x​:1,2] sPM/LVINTRO,DREFHV ->4
5 <$> const[PV "foo"] s/BARE ->6
-e syntax OK

@p5pRT
Copy link
Author

p5pRT commented Mar 16, 2010

From @davidnicol

On Tue, Mar 16, 2010 at 1​:36 PM, Jan Dubois <jand@​activestate.com> wrote​:

(my $x)->{foo}

is not really the same thing as

my $x->{foo}

is it?

What else could it be?  my() works on names, not expressions.

Not that I like this particular example; I would always write it as​:

   my $x = { foo => "bar" };

what a relief. I was worried that the my somehow reached into the
internals of %$x the way

  local $x->{foo} = q/bar/;

would.

--
question doubt

@p5pRT
Copy link
Author

p5pRT commented Mar 21, 2010

@iabyn - Status changed from 'open' to 'rejected'

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