2012-10-19 73 views
2

我最近一直在試圖自學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變量中,但事實並非如此。所以,我有兩個問題:

  1. 爲什麼會發生這種情況?它是一個操作系統的東西(我在Windows上運行)?
  2. 爲什麼添加一個\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>分配正確的值。我不知道該怎麼做。

+1

它在我的Mac上正常工作,所以我認爲這是一個Windows問題。 – Barmar

+0

你在Windows上使用了什麼perl風格? – ysth

+0

@ysth:ActivePerl – nickolayratchev

回答

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

+0

是的,我省略了檢查,因爲這個例子並不重要。但是,問題仍然存在:'$ last_name'變量未被賦予''的值。我不確定這只是一個Windows問題(更可能是我的代碼中的一些細微之處?) - 我使用的是ActivePerl,如果這種奇怪和令人困惑的行爲是由於Windows造成的,至少其中一個是3使用Perl for Windows的開發者會抱怨:) – nickolayratchev

+0

'$ | = 1'會解決這個問題,但我不明白爲什麼沒有它就無法工作。 –

+0

順便看看這個:http://perl.plover.com/FAQs/Buffering.html –