我已经写了一些代码,但我不确定错误是什么。我收到错误消息:
在 mksmksmks.pl 第 63 行的连接 (.) 或字符串中使用未初始化的值
我的代码如下:
for(my $j = 0; $j < $num2; $j++) {
print {$out} "$destination[$j]|$IP_one_1[$j]|$IP_one_2[$j]|$reached[$j]|$IP_two_1[$j]|$IP_two_2[$j]\n";`
}
我已经写了一些代码,但我不确定错误是什么。我收到错误消息:
在 mksmksmks.pl 第 63 行的连接 (.) 或字符串中使用未初始化的值
我的代码如下:
for(my $j = 0; $j < $num2; $j++) {
print {$out} "$destination[$j]|$IP_one_1[$j]|$IP_one_2[$j]|$reached[$j]|$IP_two_1[$j]|$IP_two_2[$j]\n";`
}
这意味着 , , 或 的元素之一@destination
尚未@IP_one_1
定义@IP_one_2
(@reached
尚未分配值),或已分配值undef
。您要么需要在源头检测(并防止)未定义的值,要么期望稍后再处理它们。由于您已经warnings
启用(这是一件好事),Perl 会提醒您,您的代码正在尝试连接一个字符串,其中一个被连接的值是未定义的。
考虑以下示例:
perl -wE 'my @x = (); $x[0] = "Hello "; $x[2] = "world!"; say "@x"'
在此示例中,$x[0]
有一个值,并且$x[2]
有一个值,但$x[1]
没有。当我们插入@x
一个双引号结构时,它被扩展为[element 0 (Hello )]<space>[element 1 (undef)]<space>[element 2 (world!)]
. 元素插入为空undef
字符串,并发出警告。当然,默认情况下,数组插值会在每个元素之间注入一个空格字符。所以在上面的例子中我们看到Hello <interpolation-space>(undef upgrades to empty string here)<interpolation-space>world!
您可以调查的一个示例是一个或多个数组的总大小与其他数组不同。例如, if@IP_one_2
的元素比其他元素少,或者 if$num2
的值大于任何数组中的元素数。
将以下内容放在脚本顶部附近并再次运行它:
use diagnostics;
当我在警告和诊断下运行以下单行代码时:
$ perl -wMdiagnostics -e '$a=$a; print "$a\n"'
我得到以下输出,如果你添加use diagnostics;
......当你第一次学习 Perl 的警告时,你会得到类似的东西。一个非常有用的工具。
在 -e 第 1 行 (#1) 的连接 (.) 或字符串中使用未初始化的值 $a
(W 未初始化)使用未定义的值,就好像它已经定义了一样。它被解释为“”或 0,但可能是一个错误。要抑制此警告,请为您的变量分配一个定义的值。
为了帮助您找出未定义的内容,perl 将尝试告诉您未定义的变量的名称(如果有的话)。在某些情况下它无法做到这一点,因此它还会告诉您在哪个操作中使用了未定义的值。但是请注意,perl 优化了您的程序,并且警告中显示的操作不一定会在您的程序中出现。例如,“that $foo”通常被优化为“that”。$foo,并且警告将引用连接 (.) 运算符,即使没有 . 在你的程序中。
也许我的例子对某人有用。假设变量 $x 是从数据库初始化的。它可能包含未定义的值,这是正常的。我们需要在控制台上显示它的值。作为负责任的程序员,我们决定使用“use warnings FATAL => "all";"。在这种情况下,脚本将失败。
perl -e 'use strict; use warnings FATAL => "all"; my $x; print("x=$x\n"); print("DONE\n");'
回报:
Use of uninitialized value $x in concatenation (.) or string at -e line 1.
在这种情况下,您可以使用
if(defined($x)){...}else{...}
但是,如果只是想打印一个值,这并不漂亮。
perl -e 'use strict; use warnings FATAL => "all"; my $x; print("x=".($x//"null")."\n"); print("DONE\n");'
印刷:
x=null
DONE
因为表达式 $x//"null" 检查是否定义了 // 之前的内容,如果未定义则返回 // 之后的内容。
如果你使用eq ""
它不会给出任何警告信息。
但是如果你使用eq " "
(这里你可以看到一个空格),那么它会给出这个警告信息:
在连接 (.) 或字符串中使用未初始化的值 ....