在 Perl 中的 if 语句中为变量赋值

时间:2021-04-14 01:03:55

标签: perl

尝试从 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

1 个答案:

答案 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('', ...) 的原因。