Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

perl -c

В Перле есть ключик -c check syntax only (runs BEGIN and CHECK blocks). Я тут решил выпендриться и поставил EPIC - Eclipse Perl IDE. Так оно запускает все модули без разбора с этим ключиком.

Выяснилась забавная картина.

С.pm:
sub run
{
	print "run\n";
}

print "TOP\n";

1;
main.pl:
use C;
perl -c С.pm не запускает топ-левел код в С.pm, как и можно было ожидать. Но вот perl -с main.pl неожиданно для меня запускает и печатает TOP. Выход, который я нашёл - писать код инициализации в явном INIT-блоке, а не в топ-левеле. Труъ-решение, как я понимаю - вообще никакого кода в топ-левеле модулей не писать.

Upd: Борьба с ветряными мельницами продолжается. После победы над первой мельницей возникла вторая.

Выяснил, что этот INIT-блок работает не так, как мне нужно, если модуль загружается в рантайме, а не по старту интерпретатора. А я как раз использую библиотеку RPC, которая мои модули подгружает по первому коннекту к эндпоинту. В интернетах предлагается решение, по качеству приближённое к говну: грязно залезть в кишки интерпретатора http://www.perlmonks.org/?node_id=884149 .

Я нашёл относительно красивое решение: эмулировать INIT через BEGIN, проверяя ${^GLOBAL_PHASE}. Однако, после победы над второй мельницей возникла третья: выяснилось, что на продакшене стоит старый перл, где этой переменной ещё нет.

В результате пришлось сделать очень грязно, но всё же чище, чем use B:
BEGIN {
	if (!defined(${^GLOBAL_PHASE}) or ${^GLOBAL_PHASE} eq 'RUN')
	{
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments