$ ARGV [1] Perl问题

Qui*_*sUK 1 perl

我目前正在尝试使用Perl中的命令行参数设置调试标志,我似乎遇到了一些我认为很容易的问题.

    my $debugvalue;

    my $file = $ARGV[0] or die;

    if ($ARGV[1] == "debug")
    {
        $debugvalue = 1;
    }else
    {
        $debugvalue = 0;
    }
Run Code Online (Sandbox Code Playgroud)

我想输入一个文件后跟一个单词纯粹说调试,如果没有,那么将标志设置为0.

test.pl file.txt debug
Run Code Online (Sandbox Code Playgroud)
  • 将标志设置为1

    test.pl file.txt调试

  • 将标志设置为0

我会假设你这样做,除了输入的内容,它总是落入if的第一部分并将标志设置为1.

zos*_*tay 5

这样可以正常工作,但你需要使用字符串比较eq,而不是数字比较==.

if ($ARGV[1] eq "debug")
Run Code Online (Sandbox Code Playgroud)

此外,您可以将其简化为:

my $debugvalue = $ARGV[1] eq "debug";
Run Code Online (Sandbox Code Playgroud)

一般来说,我更喜欢使用环境进行调试设置.

my $debugvalue = $ENV{DEBUG} || 0;
Run Code Online (Sandbox Code Playgroud)

然后你可以做以下事情:

DEBUG=1 test.pl file.txt
Run Code Online (Sandbox Code Playgroud)

或者为bash或zsh中的每次运行设置测试:

export DEBUG=1
test.pl file.txt
test.pl file2.txt
test.pl file3.txt
Run Code Online (Sandbox Code Playgroud)

如果您需要积极的调试输出来帮助诊断特定问题,甚至可以有多个调试级别:

DEBUG=3 test.pl file.txt
Run Code Online (Sandbox Code Playgroud)

在你的代码中:

warn "Fiddly Detail $x\n" if $debugvalue > 2;
Run Code Online (Sandbox Code Playgroud)