perl带有`#use warnings;`的正则表达式标量变量

Ash*_*Ash 0 regex perl warnings

我正在尝试完成Perl的大学任务,我们的教授告诉我们使用:

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

随着use strict;我的代码完美的作品.有use warnings;,但是,我的代码喷出所有这些东西到SDOUT,我不知道为什么(或如何关闭它).我的相关代码是:

while($diff =~ /^(\d+)((,){1}(\d+))?([adc])(\d+)((,){1}(\d+))?/mgi) {
    # This line is used for debugging the $diff regular expression scalars.
    # print "\n1: $1\t2: $2\t 3: $3\t4: $4\t5: $5\t6: $6\t7: $7\t8: $8\t9: $9\n";

    $difflinestotal += ($4 - $1) unless $4 == "";
    $difflinestotal += ($9 - $6) unless $9 == "";
    $difflinestotal += 1 if (($4 == "") && ($9 == ""));
}
Run Code Online (Sandbox Code Playgroud)

有了警告,它会在输出中间吐出:

Argument "" isn't numeric in numeric eq (==) at ./partc.pl line 145.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 145.
Argument "" isn't numeric in numeric eq (==) at ./partc.pl line 146.
Argument "" isn't numeric in numeric eq (==) at ./partc.pl line 147.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 147.
Argument "" isn't numeric in numeric eq (==) at ./partc.pl line 147.
Use of uninitialized value $9 in numeric eq (==) at ./partc.pl line 146.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 145.
Use of uninitialized value $9 in numeric eq (==) at ./partc.pl line 146.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 147.
Use of uninitialized value $9 in numeric eq (==) at ./partc.pl line 147.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 145.
Use of uninitialized value $4 in numeric eq (==) at ./partc.pl line 147.
Run Code Online (Sandbox Code Playgroud)

...而且它搞乱了我的格式化(我在控制台中生成一个表).我试图"宣布"标量,但当然(当然)那些是错误的.如何让我的Perl脚本关闭这些警告(特别是因为无论如何)?

yst*_*sth 6

这是STDERR,而不是STDOUT.

捕获变量并不总是设置; 如果他们不是,他们将是不确定的.例如,你的正则表达式((,){1}(\d+))?((\d+)第四次捕获).将?使得整个组可选.如果它不用于匹配字符串,则$ 3和$ 4将保持未定义.

在测试的地方,unless $4 == ""你应该进行测试if defined $4.

其他一些注意事项:{1}什么都不做; 它说正则表达式的前一部分应该只匹配一次 - 没有它也会这样做{1}.如果(?: ... )对不需要捕获的分组使用非捕获组(),则可以更容易地跟踪正在使用的捕获变量.