in reply to How to split main package into multiple files

Split them out of the file below, uncomment the use lines. The modules run in the order that they are 'use'd in and then test.pl runs.

Probably best to only have global scope code run from one of the files, but ymmv.

--kordaff

#!/usr/bin/perl use warnings; use strict; print "This is test.pl\n"; # use main_1; # use main_2; # use main_3; ########## main_1.pm ############################# package main::; print "this is main_1\n"; ################################################## ########## main_2.pm ############################# package main::; print "this is main_2\n"; ################################################## ########## main_3.pm ############################# package main::; print "this is main_3\n"; ##################################################

Replies are listed 'Best First'.
Re^2: How to split main package over multiple files
by mmk (Initiate) on Jun 23, 2016 at 20:35 UTC

    Thank you, Kordaff.

    Your program (after uncommenting use pragmas) produces this output:

    this is main_1 this is main_2 this is main_3 This is test.pl

    Changing main_1.pm to this

    ########## main_1.pm ############################# package main::; sub test1{ print "This is test1 in main_1\n"; }
    produces this:
    main_1.pm did not return a true value at test.pl line 4. BEGIN failed--compilation aborted at test.pl line 4.

    This was not surprising, because as its filename extension indicates, main_1.pm was a perl module, not a part of test.pl; thus, it required "1;" at the end of the file, so that it would be evaluated as TRUE. As soon as I appended it there, the error went away.

    This approach also does not share the namespace with test.pl. Let's consider this alteration on test.pl:

    #!/usr/bin/perl use warnings; use strict; use main_1; use main_2; use main_3; print "This is test.pl\n"; &test1;

    We would see the following output.

    this is main_2 this is main_3 Undefined subroutine &main::test1 called at test.pl line 8. This is test.pl

    In order to correct this problem, we have to do the following alterations in main_1.pm.

    ########## main_1.pm ############################# package main::main_1; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(&test1); sub test1{ print "This is test1 in main_1\n"; } 1; ##################################################

    Note first that &test1 needs to be exported. However, that by itself is not sufficient -- we also have to assign the actual (missing) name of the module as I have done on the first line of the code. For some reason, Perl had been tolerating the lack of proper name, in the earlier versions of this code.

    Now, we get a proper output:

    this is main_2 this is main_3 This is test.pl This is test1 in main_1

    That said, I am not interested in writing the code that needs to be part of the main package into a new module.

    I appreciated your suggestions.