我目前正在尝试使用Perl中的命令行参数设置调试标志,我似乎遇到了一些问题,我觉得这很容易。
my $debugvalue;
my $file = $ARGV[0] or die;
if ($ARGV[1] == "debug")
{
$debugvalue = 1;
}else
{
$debugvalue = 0;
}
我希望输入一个文件,然后输入一个纯粹说调试的单词,如果没有,则将标志设置为0.
test.pl file.txt debug
将标志设置为1
test.pl file.txt debug
将标志设置为0
我会假设你这样做,除了输入的内容之外,它总是落入if的第一部分并将标志设置为1.
答案 0 :(得分:5)
这样可以正常工作,但您需要使用字符串比较eq
,而不是数字比较,==
。
if ($ARGV[1] eq "debug")
此外,您可以将其缩短为:
my $debugvalue = $ARGV[1] eq "debug";
通常,我更喜欢将环境用于调试设置。
my $debugvalue = $ENV{DEBUG} || 0;
然后你可以做以下事情:
DEBUG=1 test.pl file.txt
或为bash或zsh中的每次运行设置测试:
export DEBUG=1
test.pl file.txt
test.pl file2.txt
test.pl file3.txt
如果您需要积极的调试输出来帮助诊断特定问题,甚至可以有多个调试级别:
DEBUG=3 test.pl file.txt
并在您的代码中:
warn "Fiddly Detail $x\n" if $debugvalue > 2;
答案 1 :(得分:4)
我几乎总是使用Getopt或Getopt :: Long。在CPAN中,超级简单易用且非常标准化。例如:
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $debug = 0;
my $result = GetOptions(
debug => \$debug
);
my $file = shift;
if ( $debug ) {
print( "debug is on for processing $file..." );
}
当然,因为它使用标准语法,所以你会这样称呼它:
#> test.pl file.txt --debug
或
#> test.pl --debug file.txt
----编辑----
@zostay提出了一个很好的观点,在各个级别进行调试可能非常有用。这可以添加到Getopot :: Long方法中:#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $debug = 0;
my $result = GetOptions(
"debug+" => \$debug
);
my $file = shift;
if ( $debug > 2 ) {
print( "debug is at least level 2 for processing $file..." );
}
并且,对于2级调试,将被称为:
#> test.pl --debug --debug file.txt
答案 2 :(得分:3)
您应该与eq
而不是==
进行字符串比较。
if ($ARGV[1] eq "debug")
答案 3 :(得分:1)
由于人们已经指出“eq”应该用于字符串比较和其他支持调试功能的方法,我要添加的唯一其他建议是在开发期间使用perl的-w(警告)标志也是有助于找到像你这样的问题:
#!/usr/bin/perl -w
在您的初始示例中,它会返回一个警告,如:
参数“debug”在./foo.pl第7行的数字eq(==)中不是数字。
在比较之前检查$ ARGV [1]是否存在也可能更清晰:
if ($ARGV[1] && $ARGV[1] eq "debug")
{
$debugvalue = 1;
...