in reply to Re^2: Removing CODE slot in typeglob / Reversing "use subs ...;"
in thread Removing CODE slot in typeglob / Reversing "use subs ...;"

Again, I'm only adressing the symptoms rather than thinking things through, but how's this?

#! perl -slw use strict; use 5.010; our $FOO = 'fred'; sub FOO () { 'foo' } BEGIN { undef $::{FOO}{CODE} } say defined &FOO ? 'subroutine defined' : 'subroutine undef'; say eval 'FOO if $false; 1' ? 'FOO allowed' : 'FOO not allowed'; print $FOO; __END__ C:\test>660264.p10 subroutine defined FOO not allowed fred

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^4: Removing CODE slot in typeglob / Reversing "use subs ...;"
by lodin (Hermit) on Jan 03, 2008 at 18:58 UTC

    It's the $false playing tricks again.

    $::{FOO} is the typeglob for FOO in main, and a typeglob can be dereferenced as a hash, and that's exactly what $::{FOO}{CODE} does. It becomes more clear if you add the arrow: $::{FOO}->{CODE}. The reason it works without the arrow is that $::{FOO} is an element of the %:: hash, so it's no different than $foo{bar}{baz}.

    use 5.010; our %FOO = (CODE => 'hash value'); say $::{FOO}{CODE}; __END__ hash value

    lodin

      It's the $false playing tricks again.

      Yeah. Evaling a conditional on an undefined variable in the absence of strict, is a weird way to test if something is allowed under strict.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Doh!

        I'm so used to strict I didn't even think about that it's strict that makes barewords fatal. The root node is updated to have a (hopefully) correct test.

        No code is too short for strict ...

        lodin