2017-11-27 4 views
2

Wie kann ich bekommen, wenn .. sonst zu arbeiten?

Ich schrieb ein Perl-Programm, wo der Benutzer einen Benutzernamen eingeben sollte. Wenn sie admin eingeben, sollten sie die Nachricht

Welcome, admin! 

siehe Andernfalls wird die Konsolenausgabe

sein sollte
The username is incorrect 

Hier ist mein Code

use utf8; 

print "Username: "; 

$username = <STDIN>; 

if ($username eq "admin") { 
    print "Welcome, admin!"; 
} 
else { 
    print "The username is incorrect."; 
} 

Aber was auch immer gibt der Benutzer das Programm geht weiter zum else Zweig.

Warum passiert das?

+4

Weil Sie 'admin␊' (' admin' und einen Zeilenvorschub) haben. Verwende 'chomp'! – ikegami

Antwort

3

Der Vergleich ist nie erfolgreich, weil Sie den Zeilenvorschub, der durch Drücken der Eingabetaste erstellt wurde, nicht entfernen. Verwenden Sie chomp!

+0

Wenn ich chomp verwende, muss ich die 'Username:' Nachricht entfernen und das möchte ich nicht. –

+0

@Mateas: Das ist nicht wahr. Warum sagst du das? – Borodin

+0

@Borodin Hmm ... das ist, was ich dachte. Ich weiß nicht warum ... –

8

Jedes Mal, wenn Sie nicht sicher sind, warum ein Vergleich fehlschlägt, stellen Sie sicher wissen, was in Ihrer Variable ist:

use Data::Dumper; 
local $Data::Dumper::Useqq = 1; 
print Dumper $variable; 
# print Dumper \@array; 
# print Dumper \%hash; 

wie @ikegami vorgeschlagen, müssen Sie chomp verwenden:

chomp $username; 

perldoc -f chomp

5

Der leere Operator <> ist normalerweise die beste Wahl für die Eingabe. Es wird auf der Befehlszeile angegeben Daten aus beliebigen Dateien lesen oder von der Tastatur, wenn es keine gab

Ihre $username = <STDIN> wird von der Tastatur lesen, und wenn Sie admin eingeben und die eingeben Schlüssel wird es "admin\n" enthalten. So müssen Sie den LF-Zeichen vom Ende des Eingangs chomp

Sie sollten auch use strict und use warnings 'all' zu Beginn jedes Perl-Programm

Gefällt Ihnen dieses

use strict; 
use warnings 'all'; 

print "Username: "; 
my $user_name = <>; 
chomp $user_name; 

if ($user_name eq 'admin') { 
    print "Welcome, admin!\n"; 
} 
else { 
    print "The username is incorrect\n"; 
} 
+0

Danke. Es sieht so aus, als hätte ich nicht gewusst, was Chomp macht. –

+1

@ MateaşMario eine kleine Abkürzung, um es zu einem 1-Liner machen ist: chomp (my $ user_name = ); –

0

Wie alle anderen schon erwähnt, Sie haben einen Zeilenvorschub und chomp wird das aussortieren. In dem seltenen Fall jedoch, wo ein Benutzer vielleicht ein Leerzeichen vor admin eingibt, wird es immer noch fehlschlagen. Sie können daher und rechts trim

use strict; 
use warnings 'all'; 

print "Username: "; 
my $user_name = <>; 
$user_name =~ s/^\s+|\s+$//g; 

if ($user_name eq 'admin') { 
    print "Welcome, admin!\n"; 
} 
else { 
    print "The username is incorrect\n"; 
} 

Gebrauch verließ die admin gefolgt von Newline, Leerzeichen oder Tab vor und Leerzeichen oder Tab nach admin übereinstimmen.

0

Sie vermissen die Verwendung chomp. Wenn der Benutzer admin eingegeben hat, wurde er in admin\n übersetzt, also müssen wir das \n entfernen.
chomp wird verwendet, um die $/ Variable (Zeilenvorschubzeichen) zu entfernen, die meistens auf \n (neue Zeile) eingestellt ist. $/ ist das Eingabesatztrennzeichen, standardmäßig Newline.

use utf8; 

print "Username: "; 

$username = <STDIN>; 
chomp $username; 
if ($username eq "admin") { 
    print "Welcome, admin!"; 
} 
else { 
    print "The username is incorrect."; 
} 
Verwandte Themen