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

我会假设你是如何做到这一点的,除了输入什么,它总是落入 if 的第一部分并将标志设置为 1。

4

4 回答 4

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;
于 2012-08-14T16:32:41.360 回答
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

于 2012-08-14T16:37:52.923 回答
3

eq您应该使用not进行字符串比较==

if ($ARGV[1] eq "debug")
于 2012-08-14T16:30:18.097 回答
1

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

#!/usr/bin/perl -w

在您最初的示例中,它会返回如下警告:

./foo.pl 第 7 行的数字 eq (==) 中的参数“调试”不是数字。

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

if ($ARGV[1] && $ARGV[1] eq "debug")
{
    $debugvalue = 1;
...
于 2012-08-14T17:06:45.897 回答