Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Perl: porters

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

 

 

Perl porters RSS feed   Index | Next | Previous | View Threaded


perlbug-followup at perl

Mar 15, 2010, 12:11 AM

Post #1 of 7 (200 views)
Permalink
[perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? )

# New Ticket Created by "perl [at] 0ne"
# 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 >


This is a bug report for perl from perl [at] 0ne,
generated with the help of perlbug 1.36 running under perl 5.10.0.


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

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-&gt;{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 [at] ubuntu-server6 ~]$ cat testsyntax.pl
use strict; use warnings;
use Data::Dumper;

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

print Dumper( $cache );
[cpan [at] ubuntu-server6 ~]$ perl testsyntax.pl
$VAR1 = {
'dist_file' => 'foo'
};
[cpan [at] ubuntu-server6 ~]$ 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 [at] ubuntu-server6 ~]$ 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 [at] ubuntu-server6 ~]$ 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 [at] ubuntu-server6 ~]$ cat testsyntax2.pl
use strict; use warnings;
use Data::Dumper;

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

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


[Please do not change anything below this line]
-----------------------------------------------------------------
---
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


ikegami at adaelis

Mar 16, 2010, 10:35 AM

Post #2 of 7 (196 views)
Permalink
Re: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On Mon, Mar 15, 2010 at 3:11 AM, perl [at] 0ne <perlbug-followup [at] perl>wrote:

> # New Ticket Created by "perl [at] 0ne"
> # 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.


ikegami at adaelis

Mar 16, 2010, 10:39 AM

Post #3 of 7 (195 views)
Permalink
Re: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On Mon, Mar 15, 2010 at 3:11 AM, perl [at] 0ne <perlbug-followup [at] perl>wrote:

> # New Ticket Created by "perl [at] 0ne"
> # 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


demerphq at gmail

Mar 16, 2010, 11:20 AM

Post #4 of 7 (195 views)
Permalink
Re: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On 16 March 2010 18:39, Eric Brine <ikegami [at] adaelis> wrote:
> On Mon, Mar 15, 2010 at 3:11 AM, perl [at] 0ne <perlbug-followup [at] perl>wrote:
>
>> # New Ticket Created by  "perl [at] 0ne"
>> # 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/"


jand at activestate

Mar 16, 2010, 11:36 AM

Post #5 of 7 (195 views)
Permalink
RE: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On Tue, 16 Mar 2010, demerphq wrote:
> On 16 March 2010 18:39, Eric Brine <ikegami [at] adaelis> 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


ikegami at adaelis

Mar 16, 2010, 1:15 PM

Post #6 of 7 (194 views)
Permalink
Re: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On Tue, Mar 16, 2010 at 2:20 PM, demerphq <demerphq [at] gmail> 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


davidnicol at gmail

Mar 16, 2010, 1:29 PM

Post #7 of 7 (196 views)
Permalink
Re: [perl #73570] my $foo->{foo} = $foo; syntax valid only in perl > 5.10.0 ( unintentional change? ) [In reply to]

On Tue, Mar 16, 2010 at 1:36 PM, Jan Dubois <jand [at] activestate> 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

Perl porters RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.