我最近一直在努力教自己Perl,并且一直在做一些基本的练习。在其中一个中,您有一个硬编码的姓氏哈希值。用户输入姓氏并输出名字 - 相对简单。代码如下:
#!/usr/bin/perl -w
use strict;
use warnings;
my %first_name = (
Doe => 'John',
Johnson => 'Bob',
Pitt => 'Brad',
);
print "What is your last name?\n";
chomp (my $last_name = <STDIN>);
print "Your first name is $first_name{$last_name}.\n";
现在,发生了一些奇怪的事情。 “您的姓氏是什么?\ n”行直到我向程序输入内容(并按Enter)才会显示,之后会打印以下内容:
What is your last name?
Your first name is .
Use of uninitialized value within %first_name in concatenation (.) or string at test.pl line 14, <STDIN> line 1.
现在,我理解缓冲输出的概念以及所有这些,如果我在程序开头添加$| = 1
,它就可以工作。但是,我的期望是,即使没有该行,即使print
语句字符串可能不会立即打印,我的输入字符串仍将放在$last_name
变量中,而不是。{1}}变量。所以,我有两个问题:
\n
不会刷新输出(正如各种消息来源所说的那样)? 注意:如果我通过简单打印%first_name
变量替换访问$last_name
哈希的最后一行,那么,即使输出仍然“延迟“,变量具有正确的值。
注意#2 :或者,如果打印姓氏后的代码替换为此,
if (exists $first_name{$last_name}){
print "Your first name is $first_name{$last_name}.\n";
}
else{
print "Last name is not in hash.\n";
}
然后$last_name
会从<STDIN>
分配正确的值。我不知道该怎么做。
答案 0 :(得分:3)
您没有在程序中检查姓氏是否在哈希值中,如果不是,那么您应该显示一些消息,例如“$ lastname not found”。
顺便提一下,如果我输入正确的姓氏(存在于哈希值中),你的程序在我身边正常工作。
所以你可以这样编辑你的程序:
#!/usr/bin/perl
use strict;
use warnings;
my %first_name = (
Doe => 'John',
Johnson => 'Bob',
Pitt => 'Brad',
);
print "What is your last name?\n";
chomp (my $last_name = <STDIN>);
# Check if the last_name exists in hash or not
if (exists $first_name{$last_name}){
print "Your first name is $first_name{$last_name}.\n";
}
# If it doesn't then show a custom message
else{
print "not found";
}