首页 > 解决方案 > 在Perl中的if语句中为变量赋值

问题描述

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.

标签: perl

解决方案


if这和你的说法完全没有关系。我假设完整的错误消息告诉您问题出在:

my @values = split(undef, $command);

这是命令的文档split()。它说该命令采用以下形式:

拆分 /PATTERN/,EXPR,LIMIT
拆分 /PATTERN/,EXPR
拆分 /PATTERN/
拆分

您在这里使用第二个选项 - 该函数接受两个参数,一个正则表达式(或“模式”)和一个字符串(或“expr”)。您的警告说“正则表达式编译中的未初始化值”,所以很明显问题出在第一个参数(正则表达式),而不是第二个。

用作undef正则表达式没有意义。但是 Perl 将充分利用这种情况并将 视为undef空字符串(在显示您看到的警告之后)。您可以通过替换undef为真正的正则表达式来删除警告 - 一个只包含一个空字符串的正则表达式。

my @values = split(//, $command);

注意: split()通常会接受一个字符串作为它的第一个参数,并默默地将其转换为正则表达式。如果您总是在这里明确使用正则表达式,我发现它会更加自我记录 - 这就是为什么我使用split(//, ...)而不是split('', ...)在一些评论中建议的原因。


推荐阅读