Perl - Subroutine redefined

后端 未结 9 1767
别那么骄傲
别那么骄傲 2020-12-14 16:19

I have asked this question before or searched and seen others ask - why am I getting the warning \"Subroutine mySub redefined at ../lib/Common.pm line x\"? and you

相关标签:
9条回答
  • 2020-12-14 16:48

    Make sure you didn't forget this line at the end of your module:

    1;

    I know it's been included in a few of the examples here, but I mention it because it is easy to overlook, and in my case it turned out to be the sole cause of the errors!

    0 讨论(0)
  • 2020-12-14 16:50

    I tried to use "package Common.pm" as a package name. The compiler gave me errors. Very kind of it eh? What version of Perl are you using? I tried it on 5.10.0 and 5.12.1.

    Even if you can compile it is good practice to remove the .pm file. For Example;

    File: some_package.pm;

    package some_package;
    use strict;
    
    sub yadayadayada { ... }
    
    1;
    
    0 讨论(0)
  • 2020-12-14 16:55

    Do you have a dependency loop? If Perl starts compiling your script and encounters a line like this:

    use PackageA;
    

    Perl pauses the compilation of your script; locates PackageA.pm and starts compiling it. If it encounters a line like this:

    use PackageB;
    

    Perl pauses the compilation of PackageA; locates PackageB.pm and starts compiling it. Normally, that would complete successfully, and Perl would go back to complete compiling PackageA and when that completes successfully it would go back to compiling your script and when that completes successfully it would start to execute the compiled opcodes.

    However, if PackageB.pm contains this line:

    use PackageA;
    

    You might expect it would do nothing since Perl has already processed PackageA.pm but the problem is that it hasn't finished yet. So Perl will pause the compilation of PackageB and start compiling PackageA.pm again from the beginning. That could trigger the message you're seeing about subroutines in PackageA being redefined.

    As a general rule, two packages should not both depend on each other. Sometimes however the loop is harder to locate because it is caused by a third package.

    0 讨论(0)
  • 2020-12-14 16:56

    If you're on a system with a case-insensitive filesystem (Windows, and quite often OSX), and you do use Common in one file and use common in another, you can cause problems like this.

    0 讨论(0)
  • 2020-12-14 16:59

    When you have two subroutines with the same name in different packages, you ought to see this warning (when warnings are enabled) as "Subroutine new redefined....". The simple reason (which is very close to what Grant McLean said, but still not exactly) is you must get your packages skip the compiling phase and make then require. This way, the Perl namespace manager will not find any such conflicting symbols with same name at compile time, and if you modules do not have any errors, they will work just fine afterwards also.

    Just make sure you implement

    require Module;

    statement rather than

    use Module;

    You should not see this warning again.

    0 讨论(0)
  • 2020-12-14 17:01

    Are you by any chance running this as a cgi-script on a web-server?

    I find I need to restart the webserver to get around this warning.

    0 讨论(0)
提交回复
热议问题