在串联(.)中使用未初始化的值或在mksmksmks.pl第63行使用字符串

use*_*917 3 perl initialization

我写了一些代码,我不确定错误是什么.我收到错误:

在串联(.)中使用未初始化的值或在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";`
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*idO 9

它的意思是,两个元素中的一个@destination,@IP_one_1,@IP_one_2,或@reached没有定义(没有被分配的值),或已被分配的值undef.您需要在源处检测(并阻止)未定义的值,或者稍后期望并处理它们.由于你已warnings启用(这是一件好事),Perl提醒你,你的代码正在尝试连接一个字符串,其中一个连接的值是未定义的.

请考虑以下示例:

perl -wE 'my @x = (); $x[0] = "Hello "; $x[2] = "world!";  say "@x"'
Run Code Online (Sandbox Code Playgroud)

在此示例中,$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!

您可能会调查的一个示例是,一个或多个阵列的总大小与其他阵列的大小不同.例如,如果@IP_one_2元素少于其他元素,或者if $num2值大于任何数组中元素的数量.

将以下内容放在脚本顶部附近并再次运行:

use diagnostics;
Run Code Online (Sandbox Code Playgroud)

当我在警告和诊断下运行以下单行程序时:

$ perl -wMdiagnostics -e '$a=$a; print "$a\n"'
Run Code Online (Sandbox Code Playgroud)

我得到以下输出,如果use diagnostics;你在第一次学习Perl的警告时添加一个非常有用的工具,你会得到类似的东西.

在连接(.)中使用未初始化的值$ a或在-e第1行(#1)中使用字符串

(W未初始化)使用未定义的值,就像它已经定义一样.它被解释为""或0,但也许这是一个错误.要禁止此警告,请为变量分配定义的值.

为了帮助您找出未定义的内容,perl将尝试告诉您未定义的变量(如果有)的名称.在某些情况下,它无法执行此操作,因此它还会告诉您使用未定义值的操作.但是,请注意,perl会优化您的程序,并且警告中显示的操作可能不一定会出现在您的程序中.例如,"$ foo"通常被优化为"那个".$ foo,警告将引用连接(.)运算符,即使没有.在你的程序中.