2014-10-02 2 views
0

Я переместил часть скрипта в модуль, и теперь единственная ошибка, которую я получаю, когда я делаю что-то неправильно, - это «Неопределенная подпрограмма», даже когда реальная ошибка такова: Я ошибочно набрал переменную или забыл закрывающий парик, или оставил половину двоеточия.Perl выдает неопределенную подпрограмму в модуле вместо правильной ошибки

Единственный способ найти настоящую ошибку - скопировать всю вещь в скрипт и запустить ее таким образом. Это очень утомительно. Я что-то делаю неправильно, или это только то, как модули должны работать?

Вот очень простой пример, который показывает проблему:

Модуль:

#!/usr/bin/env perl 

package CalledError; 
use Exporter qw(import); 

our @EXPORT_OK=qw(do_build_stor_pools); 

use strict; 
use warnings; 
use feature qw(say); 

sub do_build_stor_pools { 
    say "now in CalledError do_build_stor_pools"; 

    #my $undef_var="uncomment this to fix"; 
    say $undef_var; 

    return; 
} 

Вызов сценария:

#!/usr/bin/env/perl 

use strict; 
use warnings; 

my $buildstor_mod="CalledError"; 
eval "require $buildstor_mod"; 
$buildstor_mod->import(); 

CalledError::do_build_stor_pools(); 

Выполнить это так, чтобы получить Undefined subroutine &CalledError::do_build_stor_pools called at calling_test.pl line 11.

Раскомментируйте определение $undef_var, чтобы заставить его работать.

ответ

4

Если вы проверили $ EVAL_ERROR, вы увидите реальную ошибку:

#!/usr/bin/env/perl 

use strict; 
use warnings; 

my $buildstor_mod="CalledError"; 
eval "require $buildstor_mod"; 
if ([email protected]) { 
    die "[email protected]"; 
} 
$buildstor_mod->import(); 

CalledError::do_build_stor_pools(); 

Сообщение об ошибке:

Global symbol "$undef_var" requires explicit package name at CalledError.pm line 15. 
Compilation failed in require at (eval 1) line 2. 

Вы видите неопределенную ошибку подпрограммы, поскольку require не удается.

+0

Спасибо! Я думал, что однажды попытался, но я не должен был делать это правильно. – Adina

3

Вы не проверять состояние ошибки вашего eval:

eval "require $buildstor_mod"; 
die [email protected] if [email protected]; 

Однако, чтобы загрузить модуль, вы должны просто использовать use:

use strict; 
use warnings; 

use CalledError qw(do_build_stor_pools); 

do_build_stor_pools(); 

Выходы:

Global symbol "$undef_var" requires explicit package name at CalledError.pm line 14. 
+0

Я не могу использовать 'use', потому что имя файла для пакета будет меняться в зависимости от настроек среды. Вот почему я использую 'eval 'для загрузки пакета требуется $ var"; '. – Adina

+3

Чтобы использовать модули, специфичные для среды, я бы предложил использовать прагму ['if'] (http://perldoc.perl.org/if.html). – Miller

+0

Существует много альтернативных имен модулей; они легко создаются с использованием переменных, но я не думаю, что могу использовать переменную с 'if'. – Adina

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