jepri has asked for the wisdom of the Perl Monks concerning the following question:

This one is a bit too much for my little knowledge of how perl works. As part of my upgrade, mentioned in a different thread, I wiped perl and dropped a new version in, then started installing necessary modules. This has been successful, up to the point where I tried to run a CGI script under Apache that used Quantum::Superpositions. It had worked previously, but now I get a big run of errors, listed below.

At first I thought that perhaps Quantum::Superpositions::Conj had been left out of the distribution by mistake, but it is actually included in the 'Superpositions.pm' file, and being found and called. The problem (to my inexperienced eye) seems to be the 'use base' statement in Q::S::Conj. When perl hits 'use base' it tries to find the named package ( Quantum::Superpositions ) but mysteriously fails to look inside the file that it already had loaded to find the Quantum::Superpositions::Conj package.

Help?

Uncaught exception from user code: Uncaught exception from user code: Uncaught exception from user code: Uncaught exception from user code: Uncaught exception from user code: Can't locate Quantum/Superpositions/Conj.pm in @INC (@INC cont +ains: /usr/local/lib/perl/5.6.1 /usr/local/share/perl/5.6.1 /usr/lib/ +perl5 /usr/share/perl5 /usr/lib/perl/5.6.1 /usr/share/perl/5.6.1 /usr +/local/lib/site_perl/i386-linux /usr/local/lib/site_perl /usr/lib/per +l5/5.6 /usr/lib/perl5/5.005/i386-linux /usr/lib/perl5/5.005 .) at (ev +al 5) line 3. eval 'require Quantum::Superpositions::Conj ;' called at /usr/share/perl/5.6.1/base.pm line 15 base::import('base', 'Quantum::Superpositions::Conj') called a +t /usr/local/share/perl/5.6.1/Quantum/Superpositions.pm line 350 Quantum::Superpositions::Conj::True::BEGIN() called at Quantum +/Superpositions/Conj.pm line 0 eval {...} called at Quantum/Superpositions/Conj.pm line 0 require Quantum/Superpositions.pm called at /usr/lib/cgi-perl/ +modify_advert.pl line 16 main::BEGIN() called at Quantum/Superpositions/Conj.pm line 0 eval {...} called at Quantum/Superpositions/Conj.pm line 0 ...propagated at /usr/share/perl/5.6.1/base.pm line 18. base::import('base', 'Quantum::Superpositions::Conj') called a +t /usr/local/share/perl/5.6.1/Quantum/Superpositions.pm line 350 Quantum::Superpositions::Conj::True::BEGIN() called at /usr/lo +cal/share/perl/5.6.1/Quantum/Superpositions.pm line 350 eval {...} called at /usr/local/share/perl/5.6.1/Quantum/Super +positions.pm line 350 require Quantum/Superpositions.pm called at /usr/lib/cgi-perl/ +modify_advert.pl line 16 main::BEGIN() called at /usr/local/share/perl/5.6.1/Quantum/Su +perpositions.pm line 350 eval {...} called at /usr/local/share/perl/5.6.1/Quantum/Super +positions.pm line 350 BEGIN failed--compilation aborted at /usr/local/share/perl/5.6.1/Quant +um/Superpositions.pm line 350. require Quantum/Superpositions.pm called at /usr/lib/cgi-perl/ +modify_advert.pl line 16 main::BEGIN() called at /usr/local/share/perl/5.6.1/Quantum/Su +perpositions.pm line 350 eval {...} called at /usr/local/share/perl/5.6.1/Quantum/Super +positions.pm line 350 Compilation failed in require at /usr/lib/cgi-perl/modify_advert.pl li +ne 16. main::BEGIN() called at /usr/local/share/perl/5.6.1/Quantum/Su +perpositions.pm line 16 eval {...} called at /usr/local/share/perl/5.6.1/Quantum/Super +positions.pm line 16 BEGIN failed--compilation aborted at /usr/lib/cgi-perl/modify_advert.p +l line 16.

____________________
Jeremy
I didn't believe in evil until I dated it.

Replies are listed 'Best First'.
Re: Package module inclusion weirdness
by perrin (Chancellor) on Oct 08, 2001 at 18:14 UTC
    At first I thought that perhaps Quantum::Superpositions::Conj had been left out of the distribution by mistake, but it is actually included in the 'Superpositions.pm' file, and being found and called.

    What makes you think it's being found? It certainly doesn't look like it is.

    When you install a new distribution of Perl, you usually need to re-install at least some of your extra CPAN modules. Your include paths may have changed from the previous Perl. Try re-installing Q::S.

      What makes you think it's being found? It certainly doesn't look like it is.

      Because I read the logs that I posted :) To be fair, at first I thought the same thing. However the logs are a 'stack trace' of sorts. They go from the most recent subroutine called to the oldest, top to bottom. This means if you read from the bottom, you can follow the calls the programs made. Now look at this excerpt:

      base::import('base', 'Quantum::Superpositions::Conj') called at /usr/l +ocal/share/perl/5.6.1/Quantum/Superpositions.pm line 350 Quantum::Superpositions::Conj::True::BEGIN() called at Quantum +/Superpositions/Conj.pm line 0

      This shows that Quantum::Superpositions::Conj::True called a  use base 'Quantum::Superpositions::Conj';. For this to be possible, Quantum::Superpositions::Conj::True had to be found and loaded.

      The next step (up) is where it all goes wrong. import gets called from 'base' (wherever that is), asking for 'Quantum::Superpositions::Conj'. However there is no Conj.pm file, it is a package in Superpositions.pm.

      The silly thing is that to get to Quantum::Superpositions::Conj::True, perl had to read through Quantum::Superpositions::Conj to get to it! A check of line numbers confirms that perl did in fact execute the module Quantum::Superpositions::Conj::True correctly.

      You are correct in saying that perl is not finding the module, but this is not because the module is not there. It has already found and executed them once! It's the second time through, to fulfil the 'use base' calls that is throwing the errors.

      ____________________
      Jeremy
      I didn't believe in evil until I dated it.

        This is a bug in the Q::S module. It appears to be assuming features of a new version of base.pm but doesn't spell out the requirements for such a version in its dependancies. Please report this bug to the author.

        The Superpostions.pm code does: use base 'Quantum::Superpositions::Conj'; and the documentation for base.pm says:

        use base qw(Foo Bar); [...is...] Roughly similar in effect to BEGIN { require Foo; require Bar; push @ISA, qw(Foo Bar); }
        and clearly "require Quantum::Superpositions::Conj" would fail since there is no Conj.pm file.

        The documentation for (my version) of base.pm also notes:

        If any of the base classes are not loaded yet, base silently requires them. Whether to require a base class package is determined by the absence of a global $VERSION in the base package. If $VERSION is not detected even after loading it, base will define $VERSION in the base package, setting it to the string "-1, defined by base.pm".
        but Superpositions.pm never sets $Quantum::Superpositions::Conj::VERSION.

        But since I doubt that Damian would release a module that just plain doesn't work at all, I assume that newer versions of base.pm also avoid require in other situations.

        BTW, an easy fix for this problem is adding:

        use vars qw($VERSION); BEGIN { $VERSION= $Quantum::Superpositions::VERSION }
        after the "package Quantum::Superpositions::Conj" line of the modue.

                - tye (but my friends call me "Tye")