所以我的目标是找到一种简单的方法来打开Perl中的print语句。在C / C ++中,您可以使用#define选择是否运行某些代码,这是打开和关闭调试打印语句的一种方法。如果定义了#define DEBUG,那么你打印一些东西,否则你在没有print语句的情况下运行它。我想知道在Perl中是否有一种简单的方法可以做到这一点。
以下是一个如何运作的示例:
for($i = 0 ; $i < 10; $i++){
if(debug flag){
print some info;
}
do operational stuff.
}
现在从命令行可以执行以下两项操作之一:
1.没有调试打印语句的运行
perlScript.pl
2.运行调试打印语句
perlScript.pl -debug
如果有人有更好的主意,请告诉我!
答案 0 :(得分:2)
在perl中,编译时也是运行时。因此,使用gcc -Wall ...
类型语句确实没有太大的优势。
我通常的诀窍是:
#define
(my $debug = 0;
$debug += scalar grep ( "-d", @ARGV );
可能真的是一个更好的计划)
然后使用:
GetOpt
这意味着我可以轻松设置详细程度,并允许我通过递增语句来选择它。
有时我会嵌入一个信号处理程序来调整调试级别 -
print if $debug;
print $statement if $debug > 2;
这更像是我写的代码类型的问题 - 后者我特别喜欢做#!/usr/bin/perl
use strict;
use warnings;
my $debug = 0;
$debug += scalar grep ( "-d", @ARGV );
$SIG{'USR1'} = { $debug++ };
$SIG{'USR2'} = { $debug-- };
while ( 1 ) {
print "Debugging at: $debug\n";
sleep 1;
}
y的东西,因为那时我可以独立调整每个分支中的调试级别在飞行中。
答案 1 :(得分:2)
-s
选项允许您在命令行上指定main
包变量的值,尽管您必须从文件运行perl程序而不是使用-e
选项
如果您有perl程序
use strict;
use warnings;
our $debug
print $debug, "\n";
并使用命令行
运行它perl -s myprog.pl -debug
然后程序将打印1
请注意,不是在命令行上使用-s
,而是可以在程序文件本身的shebang行中指定它,所以如果您的代码看起来像
#!/usr/bin/perl -s
use strict;
use warnings;
our $debug
print $debug, "\n";
然后你的命令行只需要包含
myprog.pl -debug
答案 2 :(得分:1)
与您的想法类似,但更简洁,并转到stderr并假设您使用类似Getopt :: Long的东西来设置调试CLI选项。
warn "debug info:..." if ( $debug );
答案 3 :(得分:1)
我通常使用以下样板来通过Log::Log4perl登录脚本。您可以从命令行覆盖logbase / log配置位置(或者,更常见的是,在部署时将相应位置设置为默认值),并在向脚本提供一个或多个-verbose标志后,覆盖该日志记录并登录到屏幕, 4个详细信息为您提供屏幕输出。这使您可以轻松地从调试过渡,方法是提供verbise标记以获取每个日志输出,将其传递给自定义日志处理程序配置以调试子系统,在生产部署中设置日志记录,所有这些都是最少/无代码更改。
use Getopt::Long;
use Pod::Usage;
use Log::Log4perl qw/:easy/;
my $opts = { logconf => undef,
logbase => 'corp.team.app.appname'
debug => 0,
};
GetOptions ( 'logconf|l=s' => \$opts->{logconf},
'logbase=s' => \$opts->{logbase},
'verbose|v+' => \$opts->{debug}, ### debug levels - 0 = off (default), 1 = error, 2 = warn, 3 = info, 4 = debug.
### Ignored if a logconf is provided.
) or pod2usage(0);
### Initialize logging subsystem
init_logger();
### Usage
logger('app_subsystem')->info('some message...');
logger()->debug('debug message...');
### Initialize logging system
sub init_logger {
### If a log configuration is found, and debug was not set, use it
if ( $opts->{logconf}
and -e $opts->{logconf}
and ! $opts->{debug}
) {
Log::Log4perl->init($opts->{logconf});
}
### Otherwise fall through to easy_init a screen logger based on the verboseness level
### Logging off if no config found and no verboseness set
else {
my ($min, $max) = ( 0, 4 );
my %levels;
@levels{$min .. $max} = ( $OFF, $ERROR, $WARN, $INFO, $DEBUG );
my $log_level = $opts->{debug};
if ($log_level < $min) {
$log_level = $min;
}
elsif ($log_level > $max) {
$log_level = $max;
}
Log::Log4perl->easy_init($levels{$log_level});
}
}
### Shorthand shim sub to get a logger
### Always returns a Log::Log4perl logger object
sub logger {
my ($category) = @_;
if ($category) {
return Log::Log4perl->get_logger($opts->{logbase} . '.' . $category);
}
return Log::Log4perl->get_logger($opts->{logbase});
}
答案 4 :(得分:-2)
直到v5.10,您还可以使用-P
命令行开关在Perl脚本上使用C预处理器,perlrun
中记录。
#!perl -P
# myScript.pl
#define DEBUG(x) x
$foo = 42;
DEBUG( print "foo is $foo\n"; )
$ perl -P myScript.pl
foo is 42
(与-T
切换一样,#!perl -P
不会自动将C预处理器与您的脚本一起使用,但它会强制您每次都自己明确使用-P
开关你运行脚本)