Почему мой Perl-скрипт не использует мой модуль? - PullRequest
4 голосов
/ 15 марта 2012

module.pm

package module;
use 5.012;
use warnings;

sub Parse
{
   return 1;
}

1;

script.pl

#!/usr/bin/perl -w

use 5.012;
use warnings;
use lib 'C:/';
use module;

print Parse("value");

Stdout

Undefined subroutine &main::Parse

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Вам нужно либо написать:

print module::Parse("value");

или изменить пакет module для экспорта имени Parse.

См. http://perldoc.perl.org/perlmod.html#Perl-Modules для получения инструкций по экспорту символов из вашего модуля.

(Кстати, вы должны действительно назвать свой модуль Module, а не module. Строчные имена модулей используются для встроенных функций Perl, таких как use warnings и use strict.)

2 голосов
/ 16 марта 2012

Несколько вещей:

  • Во-первых, используйте Local в качестве префикса вашего модуля.Таким образом, если в вашей установке Perl просто окажется модуль с тем же именем, он будет использовать ваш.Назовите это «Local :: Module».Затем создайте каталог Local и назовите свой модуль Module.pm.

  • Еще одна вещь, которую вы должны понимать, это то, что вы определяете свой модуль в другом пространстве имен .По умолчанию все находится в пространстве имен main, пока вы не используете оператор package.Это создаст другое пространство имен , которое использует ваш пакет.Таким образом, если ваш пакет имеет функцию foo, и вы определили функцию foo в своей основной программе, они не будут сталкиваться.

Таким образом, вы имеетедва варианта: один (предпочтительный сейчас) - просто вызвать подпрограмму с добавлением полного имени пакета.Второй - экспортировать имена подпрограмм в основную программу.Это может вызвать проблемы с повторяющимися именами, но вам не нужно вводить имя пакета каждый раз, когда вы вызываете подпрограмму.

Без экспорта имени

Local / Module.pm

# /usr/bin/env perl
# Local/Module.pm
package Local::Module;

use strict;
use warnings;

sub Parse {
    my $value = shift;  #Might as well get it.

    print "I got a value of $value\n";
    return $value;
}
1;    #Need this or the module won't load

program.pl

# /usr/bin/env perl
# program.pl

use strict;
use warnings;

use Local::Module;

Local::Module::Parse("Foo");

С экспортом:

Local / Module.pm

# /usr/bin/env perl
# Local/Module.pm
package Local::Module;

use strict;
use warnings;
use Exporter qw(import);
our @EXPORT_OK(Parse);   #Allows you to export this name into your main program

sub Parse {
    my $value = shift;  #Might as well get it.

    print "I got a value of $value\n";
    return $value;
}
1;    #Need this or the module won't load

program.pl

# /usr/bin/env perl
# program.pl

use strict;
use warnings;

use Local::Module qw(Parse);

Parse("Foo");
...