in reply to Re: Undefined import name priority issue?
in thread Undefined import name priority issue?

The issue seems to be the existance of a file in mylib with name 'json.pm'

The problem surface even with this extremely simple setup:

mylib/json.pm:

package mylib::json;1;

mylib.pm:

package mylib; use lib 'mylib'; 1;

test.pl:

use strict; use warnings; use lib '.'; use mylib; use JSON::WebToken;

output:

Attempt to call undefined import method with arguments ("encode_json" +...) via package "JSON" (Perhaps you forgot to load the package?) at +C:/Strawberry/perl/site/lib/JSON/WebToken.pm line 12.

I assume JSON::WebToken or JSON/JSON::XS is looking in path for json.pm file and getting confused? As long as I don't use the name json.pm there is no problem.

Replies are listed 'Best First'.
Re^3: Undefined import name priority issue?
by afoken (Chancellor) on Apr 08, 2025 at 08:05 UTC
    The issue seems to be the existance of a file in mylib with name 'json.pm'

    No, half of the issue is that you are doing this:

    use lib 'mylib'; use mylib::json;

    You add the "mylib" directory to the module search path (@INC). In that case, your module should be simply named json and not mylib::json. If you want to load it as mylib::json, don't add the "mylib" directory to @INC, but the directory containing the "mylib" directory (i.e. "."). Older perls already include "." in @INC, that's why it probably works at all.

    The second part of the issue is that your filesystem is not case sensitive. Do you see any difference between json and JSON? I see four different bits, but your filesystem does not. So when perl attempts to load "JSON.pm" containing the JSON package, it is fed "json.pm" containing the mylib::json package instead.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)

      Thanks: that is it exactly... should not have "use lib 'mylib';" at all, isn't needed because I want mylib.pm to reference mylib::json.

        You shouldn't have used use mylib; if you use use mylib::json; and if the module uses package mylib::json;, correct.

        You shouldn't have used use lib in modules. If you got that far, Perl already knows where modules can be found.

        You shouldn't have used use lib '.'; because the current work directory isn't guaranteed to be the script's directory. You should be using

        use FindBin qw( $RealBin ); use lib $RealBin;
Re^3: Undefined import name priority issue?
by hippo (Archbishop) on Apr 08, 2025 at 08:06 UTC

    You are on MS Windows where the default filesystem is case insensitive. Blame Microsoft (again).


    🦛