为什么会出现“未初始化值”的警告?
问题描述:
下面的脚本是在学习Perl的锻炼4.6.4。要求在不使用reverse
的情况下打印出“反向列表”。为什么会出现“未初始化值”的警告?
虽然产量的问题问什么,我得到了输入和输出,它说“Use of unitialized value in print at line 18, <> line 4
”之间的警告。 我想我权利line 10
数组。为什么我仍然收到警告?
1 #!/usr/bin/perl
2 #exercise4_6_4
3 use warnings;
4 use strict;
5
6 print "Type in your list: \n";
7 my $input =<>;
8 chomp $input;
9 my $i=0;
10 my @array;
11 while ($input ne "") {
12 $array[$i] = $input;
13 $input =<>;
14 chomp $input;
15 $i++;
16 };
17 while ($i !=0) {
18 print $array[$i],"\n";
19 $i--;
20 };
21 print "$array[$i]";
运行脚本显示以下内容:
Type in your list:
child
books
flight
Use of uninitialized value in print at exercise4_6_4.pl line 18, <> line 4.
flight
books
child
答
因为您的上一个$i++
在第15行递增$ i,循环结束,则第18行尝试获得$array[$i]
,但是您没有在$ array [$ i]中存储任何内容。
你可以添加一个$i-- if $i > 0
线16 17之间和线来解决这个问题。
对于它的价值,你可以使用push和pop,而不必担心增加计数器
use strict;
use warnings;
print "Type in your list: \n";
my @input;
push @input,$_ while defined($_ = <>) && $_ ne "\n";
print pop @input while @input;
+0
啊,对。我忘记了最后一个$我是数组中元素个数的一个加号!对不起,新手错误。非常感谢! – 2013-03-19 23:53:48
答
您可能只需要像这样的东西线,以取代18行:
print $array[$i-1], "\n";
阵列有其局限性。 :)
此外,以供将来参考...这可能是张贴代码,而行是个好主意号码在这里。 :) – summea 2013-03-19 23:44:08
“未初始化的值”并不意味着一个未声明的标识符,这意味着'undef'。这不是在抱怨'@ array' - 阵列永远是“初始化” - 而是关于'$阵列[$ i]'。 – ruakh 2013-03-19 23:44:31