Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to "use" multiple modules with one "use"?

Tags:

perl

I want use some packages and some pragmas in all my programs, like:

use 5.014;
use warnings;
use autodie;
use My::ModuleA::Something;
use ModuleB qw(Func1 Func2);

I don't want repeat myself in every module, so looking for a way how to make one package e.g. My::Common what will contain the above packages and in my programs do only:

use My::Common;
say Func1("hello"); #say enabled and Func1 imported in the My::Common

how to achieve this?

The was read preldoc -f use and perldoc perlmodlib so i think I must "somewhat" to do this with BEGIN plus require&import, but absolutely don't know how.


UPDATE: I'm already tried the basic things.

With require - my prg.pl program.

require 'mymods.pl';
$var = "hello";
croak "$var\n";

mymods.pl contain

use strict;
use feature 'say';
use Carp qw(carp croak cluck);
1;

DOES NOT WORKS. Got error:

$ perl prg.pl 
String found where operator expected at prg.pl line 3, near "croak "$var\n""
    (Do you need to predeclare croak?)
syntax error at prg.pl line 3, near "croak "$var\n""
Execution of prg.pl aborted due to compilation errors.

with "use My":

use My;
$var = "hello";
croak "$var\n";

my My.pm

package My;
use strict;
use feature 'say';
use Carp qw(carp croak cluck);
1;

DOES NOT WORKS either. Got the same error.


Any working idea?

like image 906
kobame Avatar asked Jun 27 '11 09:06

kobame


People also ask

How do I import multiple modules?

Import multiple modulesYou can write multiple modules separated by commas after the import statement, but this is not recommended in PEP8. Imports should usually be on separate lines. If you use from to import functions, variables, classes, etc., as explained next, you can separate them with a comma.

Can I have multiple go mod?

You can publish multiple modules from a single repository. For example, you might have code in a single repository that constitutes multiple modules, but want to version those modules separately. Each subdirectory that is a module root directory must have its own go. mod file.

How do I run a multi-module project in Maven?

A multi-module project is built from an aggregator POM that manages a group of submodules. In most cases, the aggregator is located in the project's root directory and must have packaging of type pom. The submodules are regular Maven projects, and they can be built separately or through the aggregator POM.


2 Answers

I'd go with this:

package My::Common;
use 5.14.0;
use strict;
use warnings;
use autodie;
use Carp qw(carp croak cluck);

sub import {
    my $caller = caller;
    feature->import(':5.14');
    # feature->import('say');
    strict->import;
    warnings->import;
    ## autodie->import; # <-- Won't affect the caller side - see my edit.
    {
        no strict 'refs';
        for my $method (qw/carp croak cluck/) {
            *{"$caller\::$method"} = __PACKAGE__->can($method);
        }
    }
}

1;

Please correct me if I'm wrong, or there's a better way.


EDIT:

Sorry, I was wrong in using autodie->import...

This one should work, but it assumes that you always call My::Common from the main package:

package My::Common;
# ...
sub import {
    # ...
    strict->import;
    warnings->import;
    {
        package main;
        autodie->import;
    }
    # ...
}

So, of course, it's much safer and simpler to add a use autodie; to each script:

use My::Common;
use autodie;
# ...
like image 132
yibe Avatar answered Oct 16 '22 18:10

yibe


It's actually fairly simple, if you override your "common" module's import method. See the source of chromatic's Modern::Perl module for an example of exporting pragmas.

For re-exporting things defined in other modules, I seem to recall that $export_to_level (see the Exporter docs, although it's not explained all that clearly) should do that, although I can't find any good examples at the moment. Another option would be Pollute::persistent, although I haven't used it, don't know anyone else who's used it, and can't say how stable/solid it's likely to be. If it works, though, it's probably the quickest and easiest option.

like image 8
Dave Sherohman Avatar answered Oct 16 '22 16:10

Dave Sherohman