2

私は最近、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 つの質問があります。

  1. なぜこうなった?それはOSの問題ですか(私はWindowsで実行しています)?
  2. 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>。これについてどうすればよいかわかりません。

4

1 に答える 1

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

おそらく、バッファリングに苦しんでいます。

于 2012-10-19T04:09:04.513 に答える