我最近一直在试图自学Perl并一直在做一些基本的练习。在其中之一,你有一个硬编码的姓氏到名字的散列。用户输入姓氏并输出名字 - 相对简单。代码如下: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
变量中,但事实并非如此。所以,我有两个问题:
- 为什么会发生这种情况?它是一个操作系统的东西(我在Windows上运行)?
- 为什么添加一个
\n
不会刷新输出(正如各种来源所说的那样)?
注:如果我更换与$last_name
变量的简单的印刷访问%first_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>
分配正确的值。我不知道该怎么做。
它在我的Mac上正常工作,所以我认为这是一个Windows问题。 – Barmar
你在Windows上使用了什么perl风格? – ysth
@ysth:ActivePerl – nickolayratchev