Perl奇怪的缓冲输出行为

Perl奇怪的缓冲输出行为,perl,io,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";

我最近一直在自学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";

然后,
$last\u name
确实从
获得了正确的值。我不知道该怎么办。

您没有在程序中检查姓氏是否在哈希中,如果不是,则应显示一些消息,如“$lastname not found”

顺便说一下,如果我输入正确的lastname(存在于散列中),您的程序在我这边运行良好

因此,您可以按如下方式编辑程序:

#!/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";
}    
#/usr/bin/perl
严格使用;
使用警告;
我的%first\u name=(
Doe=>“约翰”,
约翰逊=>“鲍勃”,
皮特=>“布拉德”,
);
打印“您姓什么?\n”;
chomp(我的$last_name=);
#检查哈希中是否存在姓氏
如果(存在$first_name{$last_name}){
打印“您的名字是$first\U name{$last\U name}。\n”;
}
#如果没有,则显示自定义消息
否则{
打印“未找到”;
}    

也许你是。

它在我的Mac电脑上运行良好,所以我认为这是Windows的问题。你在Windows上使用什么风格的perl?在什么样的环境中?仅仅是一个windows cmd窗口?我用运行
perl.exe的常规命令行和Komodo IDE进行了尝试。两者都给出了相同的结果。是的,这对我在ActivePerl for Windows上非常有效。我有点怀疑你的字符编码。我想看看
使用Encode qw(Encode)是什么;打印编码('utf8','Doe')或<代码>打印编码('utf8',$last_name)$last\u name
变量未分配
中的值。我不确定这是否只是一个Windows问题(更可能是代码中的一些微妙之处?)——我使用的是ActivePerl,如果这种奇怪和混乱的行为是Windows造成的,其他3个使用Perl for Windows的开发人员中至少有一个会抱怨:)
$|=1
可以解决这个问题,但我不明白为什么没有它就不能工作。嗯。。这并不能解决问题。。。问题是输出缓冲和未接收正确输入的混合。查看我的笔记:在原始问题中。我注意到,如果您使用我编写的代码,那么您将不会面对问题,请尝试并让我知道。是的,我刚刚编辑了问题以包含此内容。谢谢它似乎也解决了我的问题!
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";
}
#!/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";
}