Как я могу заставить Perl давать предупреждающее сообщение, когда определенный пакет/тег импортируется?

В качестве обходного пути мы создали небольшую Java-программу, которая позволяет вам передавать HTTP-запросы через SSL-туннель с поддержкой CAC. См. cac-agent .

Это хорошо сработало для нас, позволяя всем службам работать с одним и тем же обратным прокси, но мы все еще открыты для других подходов.

6
задан brian d foy 9 October 2008 в 15:41
поделиться

2 ответа

Ну, поскольку Вы конкретно заявляете, что хотите предупредить в случаях use Mod qw<:oldmode>; Это работает лучше:

package Foo;
use base qw<Exporter>;
use Carp qw<carp>;
...
sub import { 
    #if ( grep { $_ eq ':oldmode' } @_ ) { # Perl 5.8
    if ( @_ ~~ ':oldmode' ) {              # Perl 5.10 
        carp( 'import called with :oldmode!' );
    }
    goto &{Exporter->can( 'import' )};
}

Благодаря Frew, для упоминания Perl 5.10 умный синтаксис соответствия. Я изучаю все способы работать Perl 5.10 в мой код.

Примечание: стандартный способ использовать средство экспорта в импорте sub состоит в том, чтобы или управлять $Exporter::ExportLevel или звонить Foo->export_to_level( 1, @_ ); Но мне нравится путь выше. Это более быстро и, я думаю, более простой.

11
ответ дан 8 December 2019 в 05:24
поделиться

Вы пишете свое собственное sub import в package Foo это назовут со списком параметров от use Foo.

Пример:

package Foo;
use Exporter;

sub import {
    warn "called with paramters '@_'";

    # do the real import work
    goto &{Exporter->can('import')};
}

Таким образом в sub import можно искать список аргументов тег устаревший и затем бросить предупреждение.

Обновление: Как Лесоруб указывает, необходимо звонить goto &{Exporter->can('import')}. Эта форма goto заменяет текущий вызов подпрограммы на стеке, сохраняя текущие аргументы (если таковые имеются). Это необходимо, потому что импорт Средства экспорта () метод экспортирует в пространство имен своей вызывающей стороны.

12
ответ дан 8 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: