Perl: проверьте, был ли ваш файл загружен как модуль или запущен напрямую - PullRequest
3 голосов
/ 02 марта 2010

Как мне написать тест на Perl, чтобы увидеть, был ли мой файл запущен напрямую или импортирован из какого-то другого источника? Я хотел бы сделать это, чтобы упростить объединение всего в один файл, но при этом писать модульные тесты для функций. Моя идея состоит в том, чтобы иметь что-то вроде этого:

if (running_directly()) {
  main();
}

def main {
  this();
  that();
}

def this {
  # ...
}

def that {
  # ...
}

Затем в отдельном скрипте Perl я могу загрузить исходный файл и вызвать его и это как модульные тесты.

Я помню, как это делал раньше, но не могу вспомнить, как это сделать. Я бы не хотел проверять $ 0 на какое-то известное значение, потому что это означает, что пользователь не может переименовать скрипт.

Ответы [ 3 ]

11 голосов
/ 02 марта 2010

Прежде всего, в Perl нет ключевого слова def. :)

Но вы можете проверить, выполняется ли модуль напрямую или включен где-либо еще, выполнив это:

__PACKAGE__->main unless caller;

Поскольку caller ничего не вернет, если вы находитесь на вершине стека вызовов, но будет, если вы находитесь внутри use или require.

Некоторые люди приписывают этому шаблону ужасный неологизм "modulino", поэтому используйте его в качестве топлива для Google.

4 голосов
/ 02 марта 2010

Возможно, вы думаете о рецепте "modulino" Брайана Д. Фоя , который позволяет загружать файл в виде отдельного скрипта или модуля.

Это также более подробно описано в его статье «Скрипты как модули» для журнала Perl и « Как скрипт становится модулем» на Perlmonks. *

1 голос
/ 02 марта 2010

См. Мой связанный вопрос о тестировании сценариев Perl.Вам также может быть интересно запустить REPL с соответствующим модулем:

package REPL;

use Modern::Perl;
use Moose;

sub foo {
    return "foo";
}

sub run {
    use Devel::REPL;
    my $repl = new Devel::REPL;
    $repl->load_plugin($_) for qw/History LexEnv Refresh/;
    $repl->run;
}

run if not caller;

1;

, а затем в командной строке:

$ perl REPL.pm
$ REPL->new->foo;
bar
^D
$ perl -MREPL -E "say REPL->new->foo"
bar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...