LINUX.ORG.RU

История изменений

Исправление shell-script, (текущая версия) :

Тут уже полёт фантазии неограничен. За полминуты вот такое набросалось.

$ cat mod.pm

package Foo;

use strict;
use warnings;

sub can {
        my $name = __PACKAGE__;
        print "$name can\n";
        return 1;
}

1;
$ cat test.pl
#!/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;
}
$ cat test.pl
#!/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(), который будет проверять другие вещи и не станет обращать внимания не имена.