ryuuseki
asked on
Subroutine library calls in Perl
In Perl, I have created a file containing several shared subroutines ("subrout.lib") and then including the command "require 'subrout.lib';" in each script that references one or more of the subroutines. That works well except when a script calls itself (for instance, to replot the screen with the data sorted differently). It clearly accesses the subroutines the first time, but does not access them in subsequent calls.
When I include the shared subroutines in each script, everything works fine. That obviously increases the size of my scripts and is no fun to maintain. Before I proceed, I thought I would ask what is the best way to (a) set up a library of subroutines and (b) call a subroutine from that library.
When I include the shared subroutines in each script, everything works fine. That obviously increases the size of my scripts and is no fun to maintain. Before I proceed, I thought I would ask what is the best way to (a) set up a library of subroutines and (b) call a subroutine from that library.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
*sigh* Just when I think I understood something, I realize I really didn't.
The failure appears to be related to the scoping of "my" variables. I have always used strict scoping with "my" variables. What I didn't quite understand was the concept of packaged scoping of the "my" vars.
Simply put, in the following example, $v2 is visible to the subroutine "test":
(main.pl)
use strict;
my($v1) = "VAR 1";
my($v2) = "VAR 2";
print "$v1\n";
print "$v2\n";
&test();
sub test {
print "$v2\n"; }
If I change it to the following, $v2 is not visible to "test":
(main.pl)
use strict;
require "subrout.lib";
my($v1) = "VAR 1";
my($v2) = "VAR 2";
print "$v1\n";
print "$v2\n";
&test();
(subrout.lib)
sub test {
print "$v2\n"; }
1;
By changing "my($v2)" to "our($v2)" it becomes visible outside of the "main" package.
I'm still not sure why the complicated script works the first time through but not on subsequent calls. I'll have to dig deeper to figure that out.
In the meantime, I'd still appreciate comment regarding my previous comment re: the propriety of using require.
The failure appears to be related to the scoping of "my" variables. I have always used strict scoping with "my" variables. What I didn't quite understand was the concept of packaged scoping of the "my" vars.
Simply put, in the following example, $v2 is visible to the subroutine "test":
(main.pl)
use strict;
my($v1) = "VAR 1";
my($v2) = "VAR 2";
print "$v1\n";
print "$v2\n";
&test();
sub test {
print "$v2\n"; }
If I change it to the following, $v2 is not visible to "test":
(main.pl)
use strict;
require "subrout.lib";
my($v1) = "VAR 1";
my($v2) = "VAR 2";
print "$v1\n";
print "$v2\n";
&test();
(subrout.lib)
sub test {
print "$v2\n"; }
1;
By changing "my($v2)" to "our($v2)" it becomes visible outside of the "main" package.
I'm still not sure why the complicated script works the first time through but not on subsequent calls. I'll have to dig deeper to figure that out.
In the meantime, I'd still appreciate comment regarding my previous comment re: the propriety of using require.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
In theory, should the calls using require work? Is there any inherent problem with this method? The scripts are on our internal server, and too large to post in this forum. I can try to write a smaller script that replicates the failure, but I'd rather put my efforts toward proper technique if this method is not recommended.