Perl奇怪的缓冲输出行为

时间:2012-10-19 03:39:31

标签: perl io

我最近一直在努力教自己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}}变量。所以,我有两个问题:

  1. 为什么会这样?它是操作系统的东西(我在Windows上运行)?
  2. 为什么添加\n不会刷新输出(正如各种消息来源所说的那样)?
  3. 注意:如果我通过简单打印%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>分配正确的值。我不知道该怎么做。

1 个答案:

答案 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";
}    

也许你是suffering from buffering