Есть ли способ включить / отключить Smart :: Comments через переключатель командной строки в моей программе Perl? - PullRequest
4 голосов
/ 02 ноября 2011

Я хотел бы включить / отключить комментарии в моей программе Perl, использующие модуль Smart :: Comments.Я поиграл с идеей сделать это, предоставив ключ --verbose как часть моего списка параметров командной строки.Когда этот переключатель установлен, я думал о включении модуля Smart :: Comment следующим образом:

#!/usr/bin/perl

use Getopt::Long;
use Smart::Comments;

my $verbose = 0;
GetOptions ('verbose' => \$verbose);

if (! $verbose) {
  eval "no Smart::Comments";
}
### verbose state: $verbose

Однако это не работает для меня.Кажется, что-то связано с тем, как работает Smart :: Comments, поэтому я подозреваю, что я пытаюсь отключить модуль с помощью бита eval «no ...».Кто-нибудь может предложить мне какое-нибудь руководство по этому вопросу?

Ответы [ 2 ]

10 голосов
/ 02 ноября 2011

Извлеките строку use Smart::Comments из сценария и запустите сценарий с параметром -MSmart::Comments или без него. Использование параметра -M<module> похоже на помещение оператора use <module> в начале сценария.

# Smart comments off
$ perl my_script.pl

# Smart comments on
$ perl -MSmart::Comments my_script.pl ...

Также см. Переменную $ENV{Smart_Comments} в Smart::Comments документах. Здесь вы должны использовать Smart::Comments в своем скрипте, как

use Smart::Comments -ENV;

, а затем запустить

$ perl my_script.pl 
$ Smart_Comments=0 perl my_script.pl

для запуска без умных комментариев и

$ Smart_Comments=1 perl my_script.pl

для запуска с умными комментариями.


Обновление Модуль Smart::Comments является исходным фильтром. Попытка включить и выключить его во время выполнения (например, eval "no Smart::Comments") не будет работать. В лучшем случае вы можете выполнить некоторые настройки во время компиляции (скажем, в блоке BEGIN{} перед загрузкой Smart::Comments):

use strict;
use warnings;
BEGIN { $ENV{Smart_Comments} = " @ARGV " =~ / --verbose / }
use Smart::Comments -ENV;
...
0 голосов
/ 03 ноября 2011

Используйте прагму if:

use if !$ENV{MY_APP_NDEBUG}, 'Smart::Comments';
# or
use if $ENV{MY_APP_DEBUG}, 'Smart::Comments';

Это не загружает Smart :: Комментарии, если не требуется.

...