2015-08-31 6 views
1

Я хотел бы попросить вас дать совет по написанию модуля 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() использует my_function(), который определен в разделе «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; 

(3) подпрограммы.pl: определяет my_function().

use strict; 
use warnings; 

sub my_function { 
    print "[$_[0]] My function is working!\n"; 
} 

1; 

Проблема заключается в том, что my_function() не работает в main.pl, даже если исходный код имеет 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. 

Поскольку my_function() полезно для меня, я хочу, чтобы использовать его как в main.pl и MyClass.pm, но подпрограмма является настолько общим, что довольно странно, чтобы определить его как метод в MyClass.pm , Но также странно (мне), что мы должны написать MyClass:: до my_function(), потому что подпрограмма не зависит от MyClass.

Мой вопрос: Можно ли изменить вышеуказанные коды так, чтобы my_function() работал в main.pl без добавления MyClass:: перед вызовом функции?

ответ

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; 
+0

Спасибо за ваш ответ. Я думал, что * .pm был только для занятий. –

+1

Это для модулей, независимо от того, являются они классами или нет. Я обсуждал типы файлов, связанных с Perl [здесь] (http://stackoverflow.com/questions/6376006/what-is-the-difference-between-library-files-and-modules/6379109#6379109) – ikegami

+0

К сожалению, Директива 'package' отсутствовала. Добавлен. – ikegami

Смежные вопросы