2014-03-12 24 views
-1

我有以下脚本提示输入用户名和密码并检查它们是否匹配。但是,即使我只是在提示时输入输入,但不输入用户名或密码,它也会打印Success!。为什么?为什么我的程序即使在提示处什么也不输入的情况下工作?

#!/usr/bin/perl 

%data = qw(
    javad root 
    ali  1234 
    george password 
); 

print "Please enter your name :\n"; 
$name = <STDIN>; 
chomp($name); 
$pass = $data{$name}; 

#receiving password from user 
#compare it with correct password 
#print the result 
print "What is your password ?\n"; 
$guess = <STDIN>; 
chomp($guess); 

$whileTest = "True"; 
while ($whileTest eq "True") { 
    if ($pass eq $guess) { 
     print "Success!\n"; 
     $whileTest = "False"; 
    } 
    elsif ($pass ne $guess) { 
     print "Wrong password , Try again :\n"; 
     $guess = <STDIN>; 
     chomp($guess); 
    } 
} 
+3

因为你实际上并不需要在'%data'中存在'$ name'。因此,'$ data {$ name}'返回[undef](http://perldoc.perl.org/functions/undef.html),这将'eq'一个空密码。 – Miller

+1

请用户在您的代码中正确缩进。我已经清理了它,使其更具可读性。 – ThisSuitIsBlackNot

+5

'严格使用;使用警告;' – squiguy

回答

1

快速修复

$pass = $data{$name} or die "No password for $name"; 

当你输入空白名称,密码是undef后来与空字符串相等于真实的,允许访问。 use warnings;至少会抱怨这种比较。

+2

你有什么反对“0”作为密码? :) – ysth

+0

@ysth我没有什么效率反对它。其实我有,'或'比''更有效率,以防止它。 :) –

+0

'defined($ pass = $ data {$ name})或死“没有$ name的密码”;''或'$ pass = $ data {$ name};如果!defined($ pass);'“没有$ name的密码” – ikegami

相关问题