Проблема Perl "требует" тот же файл - PullRequest
3 голосов
/ 22 июля 2011

У меня есть общий модуль в Perl. Основной программе нужны два файла, во-первых, общий файл (назовем его «X»), а во-вторых, файл «пакет». Файл 'X' также включен в файл 'package' с использованием 'require'. Когда я компилирую эту программу, она выдает следующую ошибку:

Undefined subroutine &main::trim called at testing.pl line 8.

Насколько я понимаю, Perl не смог найти модуль trim (). Если я не включу файл пакета, он запустится без проблем.

Может кто-нибудь пролить свет на эту проблему?

Вот мои коды:

Основная программа: testing.pl

#!/usr/bin/perl -w

use strict;
use postgres;

require "shared.pl";

trim("als");

Файл пакета: postgres.pm

#!/usr/bin/perl

package postgres;

use strict;
use DBI;

require "shared.pl";

1;

общий файл: shared.pl

#!/usr/bin/perl

# =============
# shared module 
# =============

use strict;

sub trim($)
{
}

1;

Ответы [ 2 ]

5 голосов
/ 22 июля 2011

Если модуль не использует package, вам нужно do вместо require. См. В чем разница между библиотечными файлами и модулями? .

do "shared.pl" or die $@;

Вы действительно должны создать правильный модуль с оператором package.

package Shared;

use strict;
use warnings;

our @EXPORT = qw( trim );
use Exporter qw( import );

sub trim { ... }

1;

Назовите файл Shared.pm и загрузите его, используя use Shared;.

2 голосов
/ 22 июля 2011

По умолчанию require загружает файл только один раз.В этом случае это один раз из файла postgres.pm, в пакете postgres.Таким образом, подпрограмма trim определяется в пространстве имен postgres как &postgres::trim.

Одним из способов решения этой проблемы является использование полного имени подпрограммы в файле testing.pl:

postgres::trim("als");       # not trim("als")

Другой обходной путь - взломать таблицу %INC (переменная, которая отслеживает, какие модули / файлы уже были use 'd и require' d), чтобы вы могли перезагрузить shared.pl в основной пакет:

use postgres;

delete $INC{"shared.pl"};
require "shared.pl";

Третий обходной путь - экспорт функции trim из пакета postgres в основной пакет.Документы для модуля Exporter являются хорошим введением в то, почему и как это делается.

# in postgres.pm
*main::trim = *trim;

# or in testing.pl
*trim = *postgres::trim;
trim("als");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...