breno <oainikusama@gmail.com> writes: > Dear porters, > > when sub bar is not declared at all, 'sub foo { bar() }' compiles under > strict/warnings without any issues. Same goes for 'my $x = \&bar'. > > Is this by design? I understand why glob refs would not warn or croak but > Is there a reason why explicitly named subroutines that don't exist at > compile time would not yield even a warning until they are actually called? > > On a somewhat related note, how would one detect if a named > subroutine/subref was declared or not (it's ok if it was declared but is > empty) at runtime? Right now I'm doing: > > sub subref_is_actually_there ($subref) { > require B; > my $cv = B::svref_2object($subref); > return B::class($cv->ROOT) eq 'NULL' && !${ $cv->const_sv }; > } > > and it seems to work fine but I'm not confident in it. Is there a better or > more readable/portable way? One that would not need to rely on B::*, maybe > just checking if {CODE} is undef? > > I looked on perlsub and perlref but could not reach any reasonable > explanation on either, so any help would be greatly appreciated. Have a look at how https://metacpan.org/pod/Sub::StrictDecl does it. Once we decide how to do non-default strictures, would it be worth bringing it into core? > Cheers! > garu - ilmariThread Previous | Thread Next