私は最近、Perl を独学で学ぼうとしており、いくつかの基本的な演習を行っています。そのうちの 1 つで、姓から名へのハードコーディングされたハッシュがあります。ユーザーが姓を入力し、名前を出力します。比較的簡単です。コードは次のとおりです。
#!/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";
今、奇妙なことが起こります。" What is your last name?\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
変数に配置されると予想されますが、そうではありません。そこで、これに関して 2 つの質問があります。
- なぜこうなった?それはOSの問題ですか(私はWindowsで実行しています)?
- a を追加して
\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>
。これについてどうすればよいかわかりません。