How do I include functions from another file in my Perl script?

PerlInclude

Perl Problem Overview


This seems like a really simple question but somehow my Google-Fu failed me.

What's the syntax for including functions from other files in Perl? I'm looking for something like C's #include "blah.h"

I saw the option for using Perl modules, but that seems like it'll require a not-insignificant rewrite of my current code.

Perl Solutions


Solution 1 - Perl

Use a module. Check out perldoc perlmod and Exporter.

In file Foo.pm

package Foo;
use strict;
use warnings;
use Exporter;

our @ISA= qw( Exporter );

# these CAN be exported.
our @EXPORT_OK = qw( export_me export_me_too );

# these are exported by default.
our @EXPORT = qw( export_me );

sub export_me {
    # stuff
}

sub export_me_too {
    # stuff
}

1;

In your main program:

use strict;
use warnings;

use Foo;  # import default list of items.

export_me( 1 );

Or to get both functions:

use strict;
use warnings;

use Foo qw( export_me export_me_too );  # import listed items

export_me( 1 );
export_me_too( 1 );

You can also import package variables, but the practice is strongly discouraged.

Solution 2 - Perl

Perl require will do the job. You will need to ensure that any 'require'd files return truth by adding

1;

at the end of the file.

Here's a tiny sample:

$ cat m1.pl 
use strict;
sub x { warn "aard"; }
1;

$ cat m2.pl 
use strict;
require "m1.pl";
x();

$ perl m2.pl 
aard at m1.pl line 2.

But migrate to modules as soon as you can.

EDIT

A few benefits of migrating code from scripts to modules:

  • Without packages, everything occupies a single namespace, so you may hit a situation where two functions from separate files want the same name.
  • A package allows you to expose some functions, but hide others. With no packages, all functions are visible.
  • Files included with require are only loaded at run time, whereas packages loaded with use are subject to earlier compile-time checks.

Solution 3 - Perl

Also, do 'file.pl'; will work, but modules are the better solution.

Solution 4 - Perl

I believe you are looking for the require or use keywords.

Solution 5 - Perl

I know the question specifically says "functions", but I get this post high up in search when I look for "perl include", and often times (like now) I want to include variables (in a simple way, without having to think about modules). And so I hope it's OK to post my example here (see also: Perl require and variables; in brief: use require, and make sure both "includer" and "includee" files declare the variable as our):

$ perl --version

This is perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...

$ cat inc.pl
use warnings;
use strict;

our $xxx = "Testing";

1;

$ cat testA.pl 
use warnings;
use strict;

require "inc.pl";
our $xxx;

print "1-$xxx-\n";
print "Done\n";

$ perl testA.pl 
1-Testing-
Done


$ cat testB.pl 
use warnings;
use strict;

our $xxx;
print "1-$xxx-\n";

$xxx="Z";
print "2-$xxx-\n";

require "inc.pl";

print "3-$xxx-\n";
print "Done\n";

$ perl testB.pl 
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
1--
2-Z-
3-Testing-
Done

Solution 6 - Perl

You really should look into perl modules however, for a quick hack you could always run "perl -P" which runs your perl script through the C pre-processor. That means you can do #include and friends....

Only a quick hack though, beware ;-)

Solution 7 - Perl

What are you looking for is 'require file.pl', but what you should be looking at is 'use module'.

Solution 8 - Perl

The above answers all ignored the client part: How to import the module.

See the accepted answer here: https://stackoverflow.com/questions/787899/how-do-i-use-a-perl-module-from-a-relative-location

Without the trick in this answer, you'll have plenty of trouble trying to get the module path right when you use $mymodule;

Solution 9 - Perl

require is roughly equivalent to include. All of the namespace benefits can be achieved in a required perl script just like a perl module. The "magic" is in what you put in the script.

The only caveat to including a script is you need to return 1; at the end of the script, or perl says it failed, even if you haven't called anything in the script.

require "./trims.pl"

Then in your perl script it can be as simple as:

#!/usr/bin/perl

#use "trims.pl";


sub ltrim { my $s = shift; $s =~ s/^\s+//;       return $s };
sub rtrim { my $s = shift; $s =~ s/\s+$//;       return $s };
sub  trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
return 1;

This example removes white space from the left, right or both ends of the input string. $string = trim($string);

The comment of #use "trims.pl" can be pasted in your perl script, uncommented (remove the #) and perl will look in the same folder your script is in to find trims.pl and this puts the functions ltrim(), rtrim(), and trim() in the global name space, so you can't have those function names in any other global name space or perl will detect a conflict and stop the execution.

To learn more about controlling name spaces, look into "perl packages & modules" package Foo;

https://perldoc.perl.org/functions/package

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionZain RizviView Question on Stackoverflow
Solution 1 - PerldaotoadView Answer on Stackoverflow
Solution 2 - Perlmartin claytonView Answer on Stackoverflow
Solution 3 - Perlglenn jackmanView Answer on Stackoverflow
Solution 4 - PerlDaniel PlaistedView Answer on Stackoverflow
Solution 5 - PerlsdaauView Answer on Stackoverflow
Solution 6 - PerlBenjView Answer on Stackoverflow
Solution 7 - PerlaartistView Answer on Stackoverflow
Solution 8 - PerlkakyoView Answer on Stackoverflow
Solution 9 - PerlAble MacView Answer on Stackoverflow