我有一个名为@ Lst_1的数组。我的元素之一是数组中的0。 每当我调用该元素时。在下面的示例中,存储在数组的第二个索引中的值为0。
$Log_Sheet->write(Row,0,"$Lst_1[2]",$Format);
我收到警告说
在字符串的@ Lst_1中使用未初始化的值。
请帮助我做到这一点。
答案 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是因为我设置了它,第二个是因为没有第五个元素,但是我在第六个位置放了东西。