in reply to Re: PDL and srand puzzle
in thread PDL and srand puzzle

The CORE namespace take priority. This is important because otherwise you would end up in situations like you have with PDL's srand all the time. If you want to override the core function you can do it like this:

perl -wle "use subs 'sqrt'; print sqrt(2); print CORE::sqrt(2); sub sq +rt { return sprintf('%.6g',$_[0] ** 0.5) } " 1.41421 1.4142135623731

Replies are listed 'Best First'.
Re^3: PDL and srand puzzle
by syphilis (Archbishop) on Jun 05, 2024 at 08:10 UTC
    The CORE namespace take priority.

    Thanks for that - I now think I know what the rule is:
    <RULE>
    If main::foo and CORE::foo both exist, then "foo" calls main::foo if main::foo has been imported in from some module.
    Otherwise "foo" calls CORE::foo.
    </RULE>
    Is that the way it works ?

    I'm still a bit puzzled as to why there should be this difference - but if that's the rule, then that's the rule.

    Cheers,
    Rob

      If you declare a sub foo() in your perl code, and core::foo already exists, you will get a warning "Ambiguous call resolved as CORE::foo(), qualify as such or use &" and core::foo will be called.

        If you declare a sub foo() in your perl code, and core::foo already exists, you will get a warning "Ambiguous call ....

        Yes - but only if there's a call to foo() made after that declaration of sub foo().
        At least, that's what I'm seeing on perl-5.38.0:
        D:\>perl -wle "sub sqrt {return sprintf '%.4g', $_[0] ** 0.5}" D:\>perl -wle "print sqrt(3); sub sqrt {return sprintf '%.4g', $_[0] * +* 0.5};" 1.73205080756888 D:\>perl -wle "print sqrt(3); sub sqrt {return sprintf '%.4g', $_[0] * +* 0.5}; print sqrt(2);" Ambiguous call resolved as CORE::sqrt(), qualify as such or use & at - +e line 1. 1.73205080756888 1.4142135623731
        Cheers,
        Rob