История изменений
Исправление shell-script, (текущая версия) :
Тут уже полёт фантазии неограничен. За полминуты вот такое набросалось.
$ cat mod.pm
package Foo;
use strict;
use warnings;
sub can {
my $name = __PACKAGE__;
print "$name can\n";
return 1;
}
1;
#!/usr/bin/perl
use warnings;
use strict;
use File::Slurp;
my $filename = $ARGV[0];
open(my $filehandle, '<', $filename) or die("$!\n");
my $code = read_file($filehandle);
my $modname = '';
if ($code =~ m/^package\s(.*);/) {
$modname = $1;
}
eval($code);
print "$modname loaded\n";
$modname->can();
close($filehandle);
$ perl test.pl mod.pm
Foo loaded
Foo can
Количество проверок, формат и прочее можно придумать какой угодно. Если нет желания делать стандартизированный набор методов, никто не мешает, после получения имени модуля и его загрузки, пройтись по нему и получить все методы, которые он умеет. Или сделать аналог Exporter'а, чтобы он сам сказал.
Собственно require, use и Exporter это и делают. Посмотри в perldoc, там об этом прямым текстом написано. И там же написано, что require специально проверяет соответсвие название файла, положение его на файловой системе и имя модуля, а потом только eval'ит его. Это не бага, а фича, чтобы помойку не плодить. Но если тебе это не нравится, никто не заставляет сделать nih_require(), который будет проверять другие вещи и не станет обращать внимания не имена.
Исходная версия shell-script, :
Тут уже полёт фантазии неограничен. За полминуты вот такое набросалось.
$ cat mod.pm
package Foo;
use strict;
use warnings;
sub can {
my $name = __PACKAGE__;
print "$name can\n";
return 1;
}
#!/usr/bin/perl
use warnings;
use strict;
use File::Slurp;
my $filename = $ARGV[0];
open(my $filehandle, '<', $filename) or die("$!\n");
my $code = read_file($filehandle);
my $modname = '';
if ($code =~ m/^package\s(.*);/) {
$modname = $1;
}
eval($code);
print "$modname loaded\n";
$modname->can();
close($filehandle);
$ perl test.pl mod.pm
Foo loaded
Foo can
Количество проверок, формат и прочее можно придумать какой угодно. Если нет желания делать стандартизированный набор методов, никто не мешает, после получения имени модуля и его загрузки, пройтись по нему и получить все методы, которые он умеет. Или сделать аналог Exporter'а, чтобы он сам сказал.
Собственно require, use и Exporter это и делают. Посмотри в perldoc, там об этом прямым текстом написано. И там же написано, что require специально проверяет соответсвие название файла, положение его на файловой системе и имя модуля, а потом только eval'ит его. Это не бага, а фича, чтобы помойку не плодить. Но если тебе это не нравится, никто не заставляет сделать nih_require(), который будет проверять другие вещи и не станет обращать внимания не имена.