Я хотел бы попросить вас дать совет по написанию модуля 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::
перед вызовом функции?
Спасибо за ваш ответ. Я думал, что * .pm был только для занятий. –
Это для модулей, независимо от того, являются они классами или нет. Я обсуждал типы файлов, связанных с Perl [здесь] (http://stackoverflow.com/questions/6376006/what-is-the-difference-between-library-files-and-modules/6379109#6379109) – ikegami
К сожалению, Директива 'package' отсутствовала. Добавлен. – ikegami