perl - 在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
.
解决方案
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('', ...)
在一些评论中建议的原因。
推荐阅读
- java - 在特定行中附加java中的文件
- wpf - 将 HMAC 与 OData 连接服务一起使用
- apache-spark - 减少 (key, val) RDD 列表中的值,因为这些列表是另一个 (key, val) RDD 列表中的值
- python - How to read modbus slaves (RTU) connected to a Siemens PAC4200 gateway (TCP) with python?
- google-app-engine - 在 appengine 标准 python 中使用延迟 API 的 PermanentTaskFailure(问题始于 2019 年夏季/秋季)
- autodesk-forge - 为什么这些链接的文件丢失了?
- mysql - 一个几乎或半个空的列是否比另一张表更有价值或更好?如何编写快速或节省空间的 sql?
- python - 如何在第 2 列中移动一个单元格,以便我的日期位于第 0 行,而其他所有值都保留?
- php - 如何修复“将 SameSite cookie 设置为无”警告?
- ionic-framework - 无法将 Ionic 5.0.0 更新到较新版本