2012-08-14 112 views
1

我目前正在尝试使用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的调试

  • 请问标志设置为0

我会假设这一点,你怎么做到这一点,除了无论是输入,它总是落入如果第一部分并设置标志为1

+1

好,'0 == 0'。 – cjm 2012-08-14 17:17:22

+1

这是[warnings](http://perldoc.perl.org/warnings.html)会引起的问题。 – 2012-08-14 18:41:58

+0

'$ ARGV [1] eq“debug”' – 2012-10-12 22:14:10

回答

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; 
3

你应该做字符串比较与eq==

if ($ARGV[1] eq "debug") 
4

我几乎总是使用的Getopt或:: Getopt的龙。在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提出了一个很好的观点,各级调试都可以很seful。可以添加到Getopot ::龙的做法正是如此:

#!/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的

1

由于人们已经指出,“eq”应该用于字符串比较和其他支持调试功能的方式,我唯一需要添加的其他建议是在开发过程中使用perl的-w(警告)标志是也有助于发现类似于您的问题:

#!/usr/bin/perl -w 

在你最初的例子中,它会又回到像一个警告:

争论“调试”不是在./foo.pl线数字EQ(==)数字7.

它也可能是更清洁的比较使用前检查$ ARGV [1]的存在:

if ($ARGV[1] && $ARGV[1] eq "debug") 
{ 
    $debugvalue = 1; 
... 
+3

我建议'使用warnings'而不是'-w'。首先,'-w'打开你没有写的代码的警告,这很少有帮助。另一方面,'use warnings'不像'-w'那样是短暂的(当你完成调试时,并没有真正的理由将它取出*)。 – hobbs 2012-08-14 17:30:27