我最近一直在試圖自學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