http://qs1969.pair.com?node_id=11108474


in reply to Re: Strict and warnings: which comes first?
in thread Strict and warnings: which comes first?

I usually put a use VERSION line before them. Most of my modules start off with something like:

use 5.008; use strict; use warnings;

... before even the package statement.

Replies are listed 'Best First'.
Re^3: Strict and warnings: which comes first?
by jcb (Parson) on Nov 09, 2019 at 00:25 UTC

    You are right: I think of package as part of the file header, so it goes in the very first line in a module, like the #! line in a script. I think that most of my code would probably run under 5.6, so my scripts generally lack use VERSION. I may need to see about changing that. :-)

      Since Perl 5.12, package has started to become more interesting. You can do stuffs like:

      use v5.16; use strict; use warnings; package Foo::Bar 1.2 { ...; }

      Although the extended syntax for package doesn't need feature or a use VERSION line to enable it, it seems like a good idea to put the use VERSION before it rather than after, so people with older Perls get an error message about their Perl being too old, instead of an error message about being unable to parse the package statement.

      And even in cases where I'm supporting older Perls, I keep all that stuff before package.

      Sometimes I'll also use modules before package if I know I'm not importing anything into my namespace from them, like:

      use v5.16; use strict; use warnings; use Scalar::Util (); package Foo::Bar 1.2 { ...; my $addr = Scalar::Util::refaddr($ref); # use fully-qualified nam +e because not imported }

        That is nice syntactic sugar if you want multiple versioned packages in the same file, but I usually keep to "one package per module file" and keeping package on the first line is helpful with other tools; this is similar to the insistence in the GNU Coding Standards that function names begin in the leftmost column. It is a convention that makes files easier for me to process with other (written on the spot one-shot) tools.

        And even in cases where I'm supporting older Perls, I keep all that stuff before package.
        I like that! I just adapted my package template to do the same. I'll not use strict; in versions newer than 5.12 though, because it is already included, and I'll stick to package Foo::Bar 1.2; if I have only one namespace in one file (which is the overwhelming majority).
Re^3: Strict and warnings: which comes first?
by BillKSmith (Monsignor) on Nov 22, 2019 at 23:57 UTC
    In my environment, I prefer to specify 'feature' rather than 'version' in part because it is much easier to specify correctly. When a module fails due to compatibility issues, 'feature' helps a maintenance programmer modify the module for an older perl. (If he choses to upgrade perl, he will probably upgrade to the newest version and not care about what is the oldest one he can get away with.) I do understand that 'version' is required by many development tools. That does not apply to me - at least not yet.
    Bill

      There are a bunch of features that feature.pm doesn't enable, such as //, package NAME { BLOCK }, etc. Not that use VERSION enables them either; you just need a high enough version of Perl.