2016-04-15 8 views
1

Ich versuche mit der gegebenen-wenn-Struktur ein kleines Nummer-Raten-Programm zu schreiben, aber mein Terminal gibt mir Syntaxfehler, hat jemand eine Ahnung, was schief gehen könnte?perl gegeben-wenn Struktur Syntax Fehler

use strict; 
my $secret = int(1 + rand 100); 
my $flag = 0; 
my $guess; 
print "Here\n"; 
while($flag == 0){ 
    print "Please guess a number:\n"; 
    chomp($guess = <STDIN>); 
    given($guess){ #-------------- line 13 
     when($_ < $secret){print "Too Low\n"} 
     when($_ > $secret){print "Too High\n"} 
     when($_ == $secret){print "You've guessd it!";$flag = 1} 
     default {print "User chose to exit";$flag = 1} 
    } 
} 

Fehlermeldung:

Syntaxfehler bei ./Learning_perl_chapt15.pl Leitung 13, in der Nähe ") {" Syntaxfehler bei ./Learning_perl_chapt15.pl Leitung 15, in der Nähe ") {" Syntax Fehler bei ./Learning_perl_chapt15.pl Zeile 16, in der Nähe von ";}" Syntaxfehler bei ./Learning_perl_chapt15.pl Zeile 17, in der Nähe von ";}" Ausführung von ./Learning_perl_chapt15.pl wegen Kompilierungsfehlern abgebrochen.

+1

Es funktioniert gut, wenn Sie hinzufügen 'Funktion verwenden qw (switch)'. Weitere Informationen finden Sie unter [perlsyn] (http://perldoc.perl.org/perlsyn.html#Switch-Statements) –

Antwort

1

Es sollte gut funktionieren, wenn Sie use feature 'switch' an der Spitze Ihres Programms hinzufügen.

Von perlsyn:

Switch-Anweisungen
ab Perl 5.10.1, kann man sagen,

use feature 'switch'; 

eine experimentellen Schalter zu aktivieren. Unter der "Schalter" -Funktion, erhält Perl die experimentellen Schlüsselwörter given, when, default, continue und break. Ab Perl 5.16 kann man die Switch-Schlüsselwörter mit CORE:: voranstellen, um auf die Funktion ohne eine use feature Anweisung zuzugreifen.

Hinweis:

use feature 'switch' Hinzufügen wird Ihr Programm ohne Syntaxfehler laufen lassen, aber man kann immer noch Warnungen wie diese bekommen:

given is experimental at ./test.pl line 16. 
when is experimental at ./test.pl line 17. 

Der Grund dafür ist, dass given und when die Verwendung experimenteller Smartmatch-Operator. Siehe Blogpost Experimental features now warn (reaching back to v5.10) von The Effective Perler für gute Beispiele und weitere Informationen.

Um diese Warnungen deaktivieren Sie

no warnings 'experimental::smartmatch'; 

nach der use feature 'switch' Anweisung hinzufügen. Beachten Sie jedoch, dass diese Art von Warnungen in Perl hinzugefügt wurde 5,18, so dass, wenn Sie planen, den Code auf einer früheren Perl-Version ausgeführt werden, sollten Sie

no if $] >= 5.018, warnings => 'experimental::smartmatch'; 

stattdessen eine "Unknown warnings category" Failure zu vermeiden verwenden.

Schließlich werden alle diese Überlegung kann unter Verwendung des experimental Pragma stattdessen leichter gehandhabt werden, und ersetzen use feature 'switch' mit:

use experimental 'switch'; 

Letztere sollten die Funktion und ausschalten Warnungen in einer Anweisung aktivieren.

+0

Thx! Ich habe gerade überprüft, ich benutze "Dies ist Perl 5, Version 18, Subversion 2 (v5.18.2), auch wenn ich Funktion" Schalter "verwenden, am Anfang ich noch erhalten ist experimentell an ./Learning_perl_chapt15.pl Zeile 13. wenn ist experimentell bei ./Learning_perl_chapt15.pl Zeile 14. aber zumindest kann das Programm jetzt ohne Syntaxfehler laufen –

+3

(Besser noch, verwenden Sie keine Funktion, die sehr wahrscheinlich nicht mehr funktioniert) – ikegami

+0

@ikegami Re: ' Msgstr "" "Du brauchst eigentlich kein if $]> = 5.018 ..." 'Seltsam, ich bekomme 'Unknown warning category' experimental :: switch ', wenn ich dieses Konstrukt benutze (ich benutze Perl Version 5.20.2) [Dokumentation] (http://perldoc.perl.org/warnings.html) behauptet, dass es keine solche Kategorie gibt. –