在数组值中使用未初始化的值

时间:2018-12-13 03:41:18

标签: arrays perl indexing

我有一个名为@ Lst_1的数组。我的元素之一是数组中的0。 每当我调用该元素时。在下面的示例中,存储在数组的第二个索引中的值为0。

$Log_Sheet->write(Row,0,"$Lst_1[2]",$Format);

我收到警告说

  

在字符串的@ Lst_1中使用未初始化的值。

请帮助我做到这一点。

2 个答案:

答案 0 :(得分:0)

数组的第一个索引为0。第二个元素为$List_1[1];

#!/usr/bin/env perl

use v5.22;
use warnings;

my @array = qw(foo bar);

# number of elements in array
say scalar(@array);

# last index of array
say $#array;

# undefined element (warn)
say $array[ $#array + 1];                         

答案 1 :(得分:0)

如果您只是想消除错误,

$Log_Sheet->write(Row, 0, $Lst_1[2] // 0, $Format);

这确实使用了perl 5.10的功能,但这已经足够古老了,您实际上应该使用足够新的perl来拥有它。我的意思是,有很多古老的Perl错误,所以您应该使用较新的版本。

据了解,不,$ Lst_1 [2]不包含0。它包含一个undef,在数字上下文中它恰好被当作0处理。

是的,我确实删除了$ Lst_1 [2]周围的引号-这是必要的,因为"$Lst_1[2]"将undef像字符串一样对待,因此出于"$Lst_1[2]" // 0的目的,它已成为空字符串。测试。 (空字符串也恰好被视为0,因此不会改变数字上下文中的行为。)

从您的简短摘录中还不清楚@ Lst_1是否少于3个元素长,或者@ Lst_1中是否存在明确的undef。您需要显示更大的代码摘录-甚至可能还要显示整个代码及其正在处理的数据-我们才能通过查看来确定。但是,您可以通过在给出的代码行之前添加以下内容来确定它:

if (@Lst_1 < 3) {
    print "\@Lst_1 only has " . @Lst_1 . " elements\n"
} elsif (not defined($Lst_1[2])) {
    print "\$Lst_1[2] is set to undef\n";
}

列表可以通过两种基本方式在其中包含显式的undef元素。以下代码演示了这两者:

my @List = map "Index $_", 0 .. 3;
$List[2] = undef;
$List[5] = "Index 5";

use Data::Dump;
dd @List;

这将输出

("Index 0", "Index 1", undef, "Index 3", undef, "Index 5")

第一个undef是因为我设置了它,第二个是因为没有第五个元素,但是我在第六个位置放了东西。