"错误"调用子程序需要包规范

时间:2015-08-31 14:33:23

标签: perl class oop

我想请教您编写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()

1 个答案:

答案 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;