http://www.perlmonks.org?node_id=976635


in reply to Bizarro %+ hash slice bug in Perl 5.10 to 5.14.

I investigate :)

perldoc -v "%+"

tells me %LAST_PAREN_MATCH is implemented using Tie::Hash::NamedCapture, so a hop skip and a jump to http://perl5.git.perl.org/perl.git/history/HEAD:/ext/Tie-Hash-NamedCapture to see what changed, a quick correlation with corelist, but nothing changed there since v5.13.11

Hmm

The history did mention moving the implementation of %+ into XS, so checking perl5160delta for XS I see a bunch of changes, but nothing I think could cause this behaviour

I will note that trying to Dumper \%+ or \%- outside of get_words_* returns empty -- so its definitely scope related (perhaps pad related)

Next thing I checked is "capture", but #78266: Memory leak with named regexp captures doesn't seem related

Next I notice Tied Variables but nothing jumps out

I don't think this is documented anywhere, and I suspect it hasn't been discovered and fixed intentionally -- you should submit (perlbug) the test case for inclusion into http://perl5.git.perl.org/perl.git/blob/HEAD:/ext/Tie-Hash-NamedCapture/t/tiehash.t

update: Forgot to search for %+, I found #105024: UNIVERSAL::AUTOLOAD breaks named captures/%-/%+, which could be responsible for fixing this, but Devel::Trace doesn't show any autoload / UNIVERSAL::AUTOLOAD

  • Comment on Re: Bizarro %+ hash slice bug in Perl 5.10 to 5.14.

Replies are listed 'Best First'.
Re^2: Bizarro %+ hash slice bug in Perl 5.10 to 5.14.
by tobyink (Canon) on Jun 17, 2012 at 09:55 UTC

    Thanks for looking into it. I had seen the UNIVERSAL::AUTOLOAD bug (it's the only mention of %+ in perl516delta), but dismissed it as I don't think Test::More installs a UNIVERSAL::AUTOLOAD, and I certainly wasn't. But you're right that the bug I was seeing could have been inadvertently fixed at the same time.

    I'll submit the test case to p5p in a couple of days unless anyone can convince me in this thread that the problem is already known to the core devs and tested for somewhere.

    This bug has already bitten one of my CPAN releases. Hurray to CPAN testers for alerting me to it so quickly!

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'