在打印中使用未初始化的值

时间:2014-09-25 11:03:04

标签: perl

请检查此代码。得到错误

"Use of uninitialized value in print at 2.pl line 13, <STDIN> line 1."

代码:

#!/usr/bin/perl -w

my %questions = (
    1 => "Java",
    2 => "Python",
    3 => "Perl",
    4 => "C"
);
print "Enter a number between 1 and 4:";
my $selection = <STDIN>;
print $questions{$selection};

1 个答案:

答案 0 :(得分:5)

从STDIN读取时需要删除换行符:

chomp(my $selection = <STDIN>);

原因是哈希键是唯一的,必须准确输入。 1\n被视为与1不同的密钥。

请注意,如果您使用过数组(因为您仍然使用数字),那么您就不会遇到此问题,因为1\n会以静默方式转换为数字。

您可能想要输入完整性检查,如果没有别的,那么您可以捕获这样的错误:

print "You entered: '$selection'\n";
if (not defined $questions{$selection}) {
    print "That is not a valid option\n";
}

在这种情况下,您可以获得输出:

You entered '1
'
That is not a valid option

(注意单引号字符串中的嵌入换行符)

对于将来的调试,您可能有兴趣了解Data::Dumper这是一个核心模块,这是一种打印变量的简单方法,可以向您展示其中的内容:

use Data::Dumper;

print Dumper \@foo;   # print reference to array
print Dumper $foo;    # print scalar

这样输出如下:

$VAR1 = [
          'foo',
          2,
          3
        ];
$VAR1 = 'foo';

$Data::Dumper::Useqq = 1选项很适合显示隐藏的空白。在您的情况下,它会为您打印换行符:

$VAR1 = "1\n";