7

我已经写了一些代码,但我不确定错误是什么。我收到错误消息:

在 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";`
}
4

3 回答 3

13

这意味着 , , 或 的元素之一@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,并且警告将引用连接 (.) 运算符,即使没有 . 在你的程序中。

于 2012-08-15T21:46:52.980 回答
0

也许我的例子对某人有用。假设变量 $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" 检查是否定义了 // 之前的内容,如果未定义则返回 // 之后的内容。

于 2019-10-18T03:58:17.130 回答
-1

如果你使用eq ""它不会给出任何警告信息。

但是如果你使用eq " "(这里你可以看到一个空格),那么它会给出这个警告信息:

在连接 (.) 或字符串中使用未初始化的值 ....

于 2013-05-27T14:56:42.560 回答