$ ARGV [1] Perl问题

时间:2012-08-14 16:27:27

标签: perl

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

4 个答案:

答案 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;
...