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

Я хочу включить/отключить комментарии в моей программе 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 ...". Может ли кто-нибудь предложить мне некоторые рекомендации по этому поводу?


person slm    schedule 02.11.2011    source источник


Ответы (2)


Удалите строку 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;
...
person mob    schedule 02.11.2011
comment
Да, я лучше скрою это от пользователей моего скрипта. Также я не запускаю этот скрипт с помощью perl... ‹myscript.pl›, я делаю скрипт исполняемым и запускаю его напрямую. - person slm; 02.11.2011
comment
Спасибо, гораздо логичнее то, что Smart::Comments нельзя включать/выключать во время выполнения с помощью блока eval. Я пытался понять, как использовать блок BEGIN, и ничего не получалось, это лучший подход, который я когда-либо видел, для получения того, что я хочу! - person slm; 03.11.2011
comment
no Smart::Comments; не работает не потому, что это исходный фильтр. Он может искать no Smart::Comments; и передавать код без изменений, пока не встретит use Smart::Comments;. Например, feature::qw_comments — это подключаемый модуль по ключевым словам (похожий на исходный фильтр). ), который использует эту концепцию загруженного, но неактивного для лексической области действия. - person ikegami; 03.11.2011
comment
@ikegami - я не понимаю твоего комментария. Оператор no Smart::Comments делает именно то, что вы описываете, если он встречается во время компиляции. Во время выполнения область действия eval "no Smart::Comments" ограничена оператором eval — он может отключать интеллектуальные комментарии только в операторе eval. Может быть, это все еще работает; это просто не очень полезно. - person mob; 03.11.2011

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

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

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

person FUJI Goro    schedule 03.11.2011