Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

use Perl Log In

Log In

[ Create a new account ]

cog (4665)

Journal of cog (4665)

Thursday December 30, 2004
07:33 PM

Is this a bug in Perl?

[ #22513 ]
I can't do this:

#!/usr/bin/perl
use strict
print "Hello World\n"

but I can do this:

#!/usr/bin/perl
use integer
print "Hello World\n"

I can't do this:

#!/usr/bin/perl
use Lingua::Identify
print "Hello World\n"

but I can do this:

#!/usr/bin/perl
use Date::Easter
print "Hello World\n"

Exactly... what is going on around here? :-)

Preliminary testing seemed to reveal that the reason it would only work sometimes would be that it only worked when the module version number was equal or above 1 (see * in the bottom, for the reason), but there were exceptions (strict 1.03 not working and CPAN::Mini 0.20 working, for instance).

Finding the solution would probably involve looking into the modules, which I don't think I'm able to after the day I had :-)

This seems rather odd... :-)

* - a sample error:

Lingua::Identify version 1 required--this is only version 0.10 at usr/lib/perl5/5.8.4/Exporter/Heavy.pm line 121.
BEGIN failed--compilation aborted at ./script line 3.

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • Subject says it all... O:-)
  • One signature for use is "use Module VERSION"

    You can use an expression for VERSION, even though the manual isn't crystal clear on that. A little testing goes a long way.

    print returns 1 on success, so you're trying to use that module with version 1 or more.
    --
    rjbs
    • That makes sense. Now that I think about it, I don't know how I didn't get it at first...

      But come to think about it again, what about CPAN::Mini (version 0.20) and strict?

      Wait... strict was giving a different error...

      I need to get some sleep... over and out, back again sometime tomorrow... :-)
  • It all depends on the &import of a module.

    Lingua::Identify [cpan.org] uses Exporter [cpan.org] which considers the parameter a version number and croaks because it's higher than the module's.

    strict [cpan.org] uses a custom importer which considers the number a non-existant pragma tag and croaks.

    In case noone else defines an &import, modules inherit &UNIVERSAL::import. Interestingly, that one does differentiate between a literal number and an expression:

    $ echo 'package Foo; our $VERSION = 0.1; 1;' > Foo.pm
    $ perl -le

  • You need a semi colon after the use statement.
    Without that you only have one statement:

    #!/usr/bin/perl
    use strict   print "Hello World\n"


    The return of the print statement is 1 (unless it fails).
    This effectively changes it into use strict 1.0 , whereby the module is required to be at least version 1.0

    Of course your code should look like this:

    #!/usr/bin/perl
    use strict;
    print "Hello World\n";
    • That was the precise point, the fact that the code would work some of the times without the semicolon :-)

      The part of the version one was taken care of pretty quickly [perl.org], but it took Aristotle [perl.org] to find out the reason for the exceptions [perl.org] (that is, modules below version 1 working and vice-versa).

      You wouldn't believe how ashamed of myself I am for not having solved the problem before posting it... oh well, one learns new things everyday :-)

      Anyway, if that's what it takes to bring a new user [perl.org] to the site, you ca