尝试从 Use of ininitialized value in regexp compilation
语句为变量赋值时收到警告 if
。为什么会出现此警告?
我的代码:
my $command;
if ($number == 1) {
$command = $ARGV[0];
} elsif ($number == 2) {
$command = $ARGV[1];
}
my @values = split(undef, $command); # error here
print "$values[0]\n";
输出:
Use of uninitialised value in regexp compilation at ./file.pl
例如,对于输入 i/3542/$
(仅作为一个参数),预期输出将仅为 i
。
答案 0 :(得分:3)
这与您的 if
语句完全无关。我假设完整的错误消息告诉您问题出在线路上:
my @values = split(undef, $command);
这是the documentation for the split()
command。它说命令采用以下形式:
拆分/PATTERN/,EXPR,LIMIT
拆分 /PATTERN/,EXPR
拆分 /PATTERN/
拆分
您在这里使用第二个选项 - 该函数采用两个参数,一个正则表达式(或“模式”)和一个字符串(或“expr”)。您的警告说“正则表达式编译中的未初始化值”,因此问题很明显出在第一个参数(正则表达式)上,而不是第二个。
使用 undef
作为正则表达式是没有意义的。但是 Perl 会充分利用这种情况并将 undef
视为空字符串(在显示您看到的警告之后)。您可以通过将 undef
替换为真正的正则表达式(仅包含空字符串的正则表达式)来消除警告。
my @values = split(//, $command);
注意: split()
通常会接受一个字符串作为它的第一个参数,并默默地将其转换为正则表达式。我发现如果您总是在这里明确使用正则表达式,它会更加自我记录 - 这就是我使用 split(//, ...)
而不是几条评论中建议的 split('', ...)
的原因。