in reply to Re: exists(&subname) causes strange autovivification problem
in thread exists(&subname) causes strange autovivification problem

> If you need a workaround, I'd try first checking if the glob exists before checking the slot and avoiding exists &name

I have no words to express how f*cked *p typeglobs are!!!

If only a sub is using the symbol, then the coderef is stored directly where the glob is supposed to be.

(Larry gets a spanking next time we meet ;)

Anyway this code seems to work in all edge cases, only tested on mobile phone yet.

use strict; use warnings; use feature 'say'; no autovivification; use Data::Dump qw/pp/; sub sub_exists{ my $name = shift; return exists $::{$name} # symbol exists && ( ref $::{$name} eq "CODE" # only code || (*{$::{$name}}{CODE} && 1) # also code || !1 # false ); } for my $name (qw/zero one two three/) { pp { $name => sub_exists($name) }; } our $one=1; our $two=2; sub two {2}; sub three {3}

{ zero => "" } { one => "" } { two => 1 } { three => 1 }

Cheers Rolf
(addicted to the Perl Programming Language :)
see Wikisyntax for the Monastery

TODO

Extend code to cover subs in other namespaces than main

Replies are listed 'Best First'.
Re^3: exists(&subname) causes strange autovivification problem (workaround)
by ikegami (Patriarch) on Nov 06, 2024 at 17:30 UTC

    So don't use them!

    sub sub_exists { my $name = shift; no strict qw( refs ); return exists( &$name ); }

    Bonus: Not limited to subs in the current namespace.

    To avoid the bug the OP identified, place the sub outside of scope of no autovivification;, or add use autovivification; to it.

    sub sub_exists { my $name = shift; no strict qw( refs ); use autovivification; # Disable module to avoid bug. return exists( &$name ); }