2017-01-06 8 views
0

Ich arbeite an einem Perl-Skript, das nach einem Namen in Hash sucht, gibt die Telefonnummer dieser Person zurück. Genauso wie die Suche nach einem Schlüssel im Hash und die Rückgabe des gefundenen Schlüssels. Andernfalls würde "Name nicht im Buch gefunden" gedruckt werden. Ich kann nicht auf die Elemente zugreifen, wenn ich einen Wert gebe, der im Hash vorhanden ist. Was muss ich ändern, um den Code zu ändern?Das folgende Perl-Skript auf Hashes debuggen

$namesearch=""; 
%phoneNumbers={"ramu"=>123,"rishi"=>456,"sai"=>789}; 
while($namesearch ne "END") 
{ 
    print("Enter name to search:\n"); 
    $namesearch=<STDIN>; 
    chomp $namesearch; 
if(exists($phoneNumbers{$namesearch})) 
{ 
    print "The phone Number of $namesearch is: ($phoneNumbers{$namesearch})\n"; 
} 
elsif($namesearch eq "END") 
{ 
    last; 
} 
else 
{ 
    print "Name not found in book\n"; 
    } 
} 

Der Ausgang Ich erhalte ist:

output 
Enter name to search: 
ramu 
Name not found in book 
+3

Verwenden Sie immer 'strict;' und 'Warnungen verwenden 'all';'. Das Aktivieren von Warnungen hätte dir einen Hinweis gegeben: "Referenz gefunden, wo die Liste in der richtigen Größe erwartet wird" (zeigt auf die Zeile '% phoneNumbers = {...};') – ThisSuitIsBlackNot

+0

Jetzt werden einige Kompilierungsfehler angezeigt. –

Antwort

0

Als gute Praxis Sie strict und warnings Pragma in Ihrem Code verwenden sollte es einfach zu debuggen zu machen.

Strenge

Die strenge Pragma deaktiviert bestimmten Perl-Ausdrücke, die unerwartet verhalten könnte oder nur schwer zu debuggen, um sie in Fehler drehen. Die Wirkung dieses Pragmas ist auf die aktuelle Datei oder den Gültigkeitsbereich beschränkt.

Warnungen

Dieses Pragma ebenso wie die strengen Pragma funktioniert. Dies bedeutet, dass der Bereich des Warnungspragmas auf den umschließenden Block beschränkt ist. Es bedeutet auch bedeutet, dass die Pragma-Einstellung wird nicht über Dateien (Verwendung, erfordern oder tun). So können Autoren unabhängig voneinander den Grad der Warnungsüberprüfungen definieren, die auf ihr Modul angewendet werden.

habe ich einige Änderungen in Ihrem Code und es gibt ein paar Dinge, die Sie es funktioniert machen tun sollten: über Referenzen

use strict; 
use warnings; 
use diagnostics; 

#Always declare your variables 
my $namesearch = ""; 

#Change your hash ref to a simple hash 
my %phoneNumbers = ("ramu" => 123, "rishi" => 456, "sai" => 789); 

while ($namesearch ne "END") { 
    print("Enter name to search:\n"); 
    $namesearch = <STDIN>; 
    chomp $namesearch; 
    if (exists($phoneNumbers{$namesearch})) { 
     print 
      "The phone Number of $namesearch is: ($phoneNumbers{$namesearch})\n"; 
    } 
    elsif ($namesearch eq "END") { 
     last; 
    } 
    else { 
     print "Name not found in book\n"; 
    } 
} 

Prüfen Sie auch bei Perldoc (perlreftut) Es gibt einige Erklärungen darüber, wie richtig zu verwenden, da sich die Syntax abhängig davon ändert, welche Variable Sie zum Beispiel wie Arrays oder Hashes verwenden.

+0

Anstatt die globale '$ Namesearch' zu verwenden, würde ich empfehlen, sie zu lokalisieren:' while (1) {my $ namesearch = ; ...; last if $ namesuche eq 'END'; ...} ' – stevieb