我想请教您编写Perl模块的建议。我们有三个文件。
(1)main.pl:使用my_function()
#!/usr/bin/perl
use strict;
use warnings;
use MyClass;
require "./subroutines.pl";
my $instance = MyClass->new({});
$instance->my_method("a");
MyClass::my_function("b"); # This works.
my_function("c"); # Undefined subroutine &main::my_function called
exit;
(2)MyClass.pm:定义MyClass类。 my_method()
使用{< {1}},它在" subroutines.pl"中定义。
my_function()
(3)subroutines.pl:定义package MyClass;
use strict;
use warnings;
require "./subroutines.pl";
sub new {
my $class = shift;
my $self = shift;
return bless $self, $class;
}
sub my_method{
my $self = shift;
my $text = shift;
my_function($text);
}
1;
。
my_function()
问题是use strict;
use warnings;
sub my_function {
print "[$_[0]] My function is working!\n";
}
1;
在main.pl中无效,即使源代码有my_function()
,而require "./subroutines.pl"
也有效。
MyClass::my_function()
因为[a] My function is working!
[b] My function is working!
Undefined subroutine &main::my_function called at main.pl line 11.
对我有用,我想在main.pl和MyClass.pm中使用它,但子例程非常通用,将它定义为MyClass.pm中的方法很奇怪。 。但是(对我而言)我们必须在my_function()
之前编写MyClass::
,因为子例程不依赖于my_function()
。
我的问题是:是否可以修改上述代码,以便MyClass
在main.pl中有效,而无需在函数调用之前添加my_function()
?
答案 0 :(得分:3)
require
只执行一次给定文件,因此您需要do
,但这会创建子程序的两个副本。请改用适当的模块,并使用Exporter导出符号。
Subroutines.pm
:
package Subroutines;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( my_function );
sub my_function {
print "[$_[0]] My function is working!\n";
}
1;
和
use Subroutines;