Я хочу хранить множество функций в папке и включать их в основной скрипт.
Например, у меня есть эта библиотека ABC1.pm:
package ABC1;
use strict;
use warnings;
my $var1 = 'abc1';
sub func1 {
print "$var1\n";
}
return 1;
Другой называется ABC2.pm:
package ABC2;
use strict;
use warnings;
my $var2 = 'abc2';
sub func2 {
print "$var2\n";
}
return 1;
Оба файла сохраняются в папке библиотеки. Теперь я запускаю основной скрипт, который просматривает папку для всех файлов, которые находятся внутри, и пытается загрузить их:
#!/usr/bin/env perl
#script.pl
use strict;
use warnings;
BEGIN {push @INC, './libraries/.'}
# use ABC1;
# use ABC2;
my $dir = './libraries';
my @libraries;
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
print "$file\n";
$file =~ s/\.pm$//;
print "$file\n";
push @libraries, $file;
}
eval {
foreach my $library (@libraries){
require $library;
$library->import();
}
1;
} or do {
my $error = $@;
print $error;
};
ABC1->func1();
ABC2->func2();
Если я просто запустил его со статусом использования, введенным вручную, он заработает. Но если я хочу использовать фрагмент кода, который не прокомментирован, я получаю следующую ошибку:
Не удается найти ABC1 в @INC (@INC содержит: C: / Strawberry / perl / site / lib / MSWin32-x64-multi-thread C: / Strawberry / perl / site / lib C: / Strawberry / perl / vendor / lib C: / Strawberry / perl / lib. ./libraries/. ./libraries/.) в строке 25 abc.pl. Невозможно найти метод объекта "func1" через пакет "ABC1" (возможно, вы забыли загрузить "ABC1" "?) в строке 34 abc.pl.
Но библиотеки путей отображаются в @INC, поэтому я не понимаю, что происходит.
$library->import();
) редко имеет смысл. Не та проблема, о которой вы спрашиваете. - person ikegami   schedule 04.02.2020next if ($file =~ m/^\./);
должно бытьnext if $file =~ /^\./ || $file !~ /\.pm\z/;
, потому чтоrequire
ищет только.pm
файлы. - person ikegami   schedule 04.02.2020$RealBin
вместо.
(полученного с помощьюuse FindBin qw( $RealBin );
) для поиска файлов относительно вашей программы. Не та проблема, о которой вы спрашиваете. - person ikegami   schedule 04.02.2020BEGIN {push @INC, './libraries/.'}
можно записать более чисто какuse lib 'libraries';
(илиuse lib "$FindBin/libraries";
, как предложено выше). - person ikegami   schedule 04.02.2020require EXPR
требуется путь - person ikegami   schedule 04.02.2020use [Module]
в верхней части кода? Если вы загружаете все функции, возможно, имеет смысл поместить их все в один модуль. Было бы разумнее хранить имена желаемых модулей в массиве и загружать только их динамически. - person Polar Bear   schedule 05.02.2020