[PERL] Hash auslesen

mtn

Lieutenant
Registriert
Feb. 2002
Beiträge
571
Hallo,

ich habe hier einen Hash und würde einfach gern
den Inhalt verschiedener Keys ausgeben,
aber egal was ich versuche, ich kriegs nicht hin.

Hier erstmal das Beispiel mit 2 Hashs:

Code:
#!/usr/bin/perl -w

my $obst =   {   
                "Apfel"   	=>    	["gelb", "gruen", "rund"],
                "Birne"		=>	["gelb", "gruen", "birnig", "FSInodeUsedPercent", "FSUsedSpace"],
		"Orange"	=>	["orange", "zermatscht", "rund"]
		};

my $pizza = {
                "Margaritha"    =>  "basic",
                "Salami"	=>  "Wurst",
                "Funghi"        =>  "Thunfisch"
                };

Wie muss ich es nun anstellen wenn ich bestimmte
Werte einfach auf dem Bildschirm dargestellt haben will,
z.B. alle Werte des Keys "Apfel".

Hab bei google zwar viel gefunden aber funktioniert
hat das irgendwie alles nicht.

Danke für eure Hilfe :)
 
Code:
while(@array=each(%hash))
{
  print "$array[0] -> $array[1]\n";
}
Code:
foreach $wert (values(%hash))
{
  print "$wert\n";
}
Code:
foreach $wert (keys(%hash))
{
  print "$wert\n";
}
Code:
if(exists $hash{'schlüssel'})
{
  print "$hash{'schlüssel'}\n";
}
 
Danke. :)
Die meisten Beispiele hab ich auf meiner Suche heute aber auch schon gefunden.

Könntest du bitte mal eines deiner Beispiele an mein Beispielscript anpassen,
damit ich sehe wo mein Fehler liegt?

Das wäre ganz super ;)
 
Code:
while(@array=each(%obst))
{
  if($array[0] eq 'Apfel')
  {
    print "Wert: $array[1]\n";
  }
}

Du hast bestimtm nur = und == oder == und eq verwechselt, oder?
 
Nee ich bin Anfänger und zu doof.

Ich hab dein Beispiel jetzt mal an mein Script angepasst,
also ich verwende natürlich im Original kein Obst und keine Pizzen,
er rennt da auch ordentlich durch, bringt keine Fehlermeldung,
zeigt aber auch nichts an.

Der Unterschied ist jetzt eigentlich nur das das Script jetzt nicht
mehr unter Linux sondern mit Active State Perl
unter Windows läuft, den Pfad zu Perl hab ich natürlich angepasst:

#!/c:\perl

Hab mal ein andere Programme von mir durchlaufen lassen,
auch irgendwelche Beispiele abgetippt, die laufen alle,
nur dieses blöde Script nicht :(

Trotzdem danke für deine Hilfe,
wenn dir bzw. euch noch was einfällt fände ich das echt toll :)
 
versuch mal
Code:
#!C:/perl/bin/perl -w
print "\t\tHallo!\n";
system("PASUE");
 
Klappt pefekt.

Hab den Pfad auch mal in dem anderen Script angepasst,
da passiert gar nichts außer das ich nun folgende Warnung
erhalte:

Name "Main::obst" used only once: possibible typo at krise.pl at line 44

Da steht im Script:

while(@array=each(%obst))
{
if($array[0] eq 'apfel')
{
print "Wert: $array[1]\n";
}
 
while(@array=each(%obst))
{
if(uc($array[0]) eq uc('apfel'))
{
print "Wert: $array[1]\n";
}

erklärung:

uc sollte ale buchstaben in großbuchstaben umwandeln udn diese Zeichenkette zurückgeben.

Pass bitte auf deine Groß- /Kleinschreibung auf.

%Obst, %OBST und %obst sind 3 verschiedene hashes


edit:

wenn du das -w am ende der ersten zeile wegnimmst, werden normale Warnungen nicht mehr mit ausgegeben!
 
Hmm... es klappt einfach nicht.

Immer wieder die Fehlermeldung

Name "Main:obst" used only once: possibible typo at krise.pl at line 44

Es ist zum ...
 
lad doch bitte mal das Script als *.txt oder so hoch.

ich mach es dir dann und schreib dir bemerkungen zu den Fehlern rein
 
Ja , wird wohl das Beste sein.

Ich lad mal das Original hoch, Ärger mit der Firma krieg ich da hoffentlich nicht,
ich meine, es funktioniert ja eh nix :(

Im Anhang das Script:
 

Anhänge

Ja also da werden 2 hashes geladen.

Aber was soll das Prog können?
 
Na ja, irgendwann mal soll das Programm die Werte aus den Hashes laden können.

Also z.B. wenn ich mir die Werte ausgeben will die unter "CPU" im Hash
$modules stehen,

Da soll das Ding einen Filehandle aufmachen,
ein bissel grundsätzlichen HTML-Code schreiben,
und dann eben die gewünschten Werte da entsprechend
reinschreiben.

Wie ich ein HTML-File unter perl erstelle weiß ich,
aber eben nicht wie ich mir die gewünschten Werte aus
dem entsprechenden Hash ziehe :(
 
Code:
#!E:/perl/bin/perl

my %modules =  		#es mus %modules heissen ,da es ein hash ist und nicht $modules, was ein Skalar wäre! 
( 					#hier bitte normale Klammern und keine geschweiften
                "CPU"   	=>    	["CPUCtrl", "CPUCpuUtil", "CPUInt", "CPULoad", "CPUProcSwch", "CPURunQSize", "CPUSysTime", "CPUUserTime", "CPUWio"],
                "Filesystem"	=>	["FSAvailableSpace", "FSCapacity", "FSFreeInodes", "FSInodeUsedPercent", "FSUsedSpace"],
		"Processes"	=>	["PROCAvgUsrProc", "PROCColl", "PROCExec", "PROCESSCtrl", "PROCNoZombies", "PROCNumProcs", "PROCProcWait", "PROCProcWaitInt", "PROCProcWaitUnint", "PROCTopProcs", "PROCUserProcs"],
		"Proc_Presence"	=>	["PROCPPCPUPerc", "PROCPPCount", "PROCPPMem"]
);

my %parameters = (	#gleiches wie beim ersten hash
                "CPUCtrl"       =>  "N/A",
                "CPUCpuUtil"    =>  "Percent",
                "CPUInt"        =>  "Interrupts",
                "CPULoad"       =>  "Load",
                "CPUProcSwch"   =>  "Switch",
                "CPURunQSize"   =>  "Processes",
                "CPUSysTime"    =>  "Percent",
                "CPUUserTime"   =>  "Percent",
                "CPUWio"        =>  "Percent",

		"FSAvailableSpace"	=>	"Graph",
		"FSCapacity"		=>	"Percent",
		"FSFreeInodes"		=>	"Inodes",
		"FSInodeUsedPercent"	=>	"Percent",
		"FSUsedSpace"		=>	"KBytes",

		"PROCAvgUsrProc"	=>	"Processes",
		"PROCColl"		=>	"N/A",
		"PROCExec"		=>	"Calls",
		"PROCESSCtrl"		=>	"N/A",
		"PROCNoZombies"		=>	"Processes",
		"PROCNumProcs"		=>	"Processes",
		"PROCProcWait"		=>	"Processes",
		"PROCProcWaitInt"	=>	"Processes",
		"PROCProcWaitUnint"	=>	"Processes",
		"PROCTopProcs"		=>	"N/A",
		"PROCUserProcs"		=>	"Processes",

		"PROCPPCPUPerc"	=>	"Percentage",
		"PROCPPCount"	=>	"Number",
		"PROCPPMem"	=>	"Kbytes"
		);
while(@array=each(%modules))			#tue für alle arrayelemente :
{										#schlüssel nach $array[0] und Wert nach $array[1]
    print "$array[0] => $array[1]\n";	#ausgabe des hash-wertepaares
    $p=$array[1];						#p ist Zeiger auf das array in $array[1], was oben als ein Element des hashes initialisiert wurde
    foreach(@$p)						#Ausgabe aller werte in dem array, auf das p zeigt
	{
		print "$_\n";					#ausgabe des Array-Elementes mit Zeilenumbruch
	}
}

^^die fehler sind kommentiert.

Das Script in seiner jetztigen Form gibt die Arrays in den Hashes und die hashes selber komplett aus.

Selektion der Ausgabe kann einfach mit if erfolgen!

!Denk dran, dir die erste Zeile wieder zu ändern!
 
Genial :)

Ich krieg ne Ausgabe.

Vielen Dank :)

Sei mir nicht böse, ich raff jetzt grad im Einzelnen nicht was du da gezaubert hast,
ich muss mir das morgen in Ruhe angucken, ich häng jetzt schon den ganzen Tag
vor dem Problem und hab immer nur zwischen vi und perl irgendwas.pl rumgeschaltet,
ich kanns einfach nicht mehr sehen, die schmeißen mich wohl eh bald raus,
weil ich so ein Idiot beim Programmieren bin,
ich geb mir zwar mühe,
aber irgendwie bin da zu langsam mit Lernen und Verstehen.

Ich kann grad nicht mehr,
werd mich aber morgen wieder dahinter hängen und würde mich sehr freuen,
wenn du mir dann noch Hilfestellung geben würdest.

Auf jeden Fall: Respekt :)

Und vielen Dank für deine Hilfe.

Grüße und einen fleißigen Nikolaus wünscht
 
der einzige Trick bei der Sache war, dass du ein "Hash of Array" angelegt hast.

Das hatte zur folge, dass dein hash keine werte, sondern nur Adressen und Datentypen (Array) enthielt. Das fürht im Normalfall zur anzeige ARRAY(00x0000) oder für ein Hash halt HASH(00x0000) oder so in der Art zumindest.

Also hab ich einen die Adresse in den zeiger $p geladen und eine ausgabeschleife für alle werte des Arrays, auf das der Zeiper $p zeigt, gemacht.


Dass du gar keine Anzeige hattest lag an folgendem:

Du hast beim Hash oben geschweifte klammern benutzt.
Das hatte etwa folgendes zur Folge:

%modules wurde als leeres hash initialisiert (bei dir sogar als skalar).
Darauf folgte ein Anweisungsblock (die geschweiften Klammern), in dem ein Array erstellt, aber keiner Array-Variablen zugewiesen wurde (kein "@array =" davor), und es somit gleich verloren ging.
Der Anweisungsblock wurde duch "}" geschlossen und das Prog lief normal weiter.

Daher dein Fehler in Line 44:
Zu diesem Moment wurde %modules das erste mal erwähnt (du hattest ja oben $modules deklariert) und damit auch als leeres hash initialisiert.

In einem Leeren Hash waren natürlich keine Werte oder schlüssel zu finden und daher auch keine Anzeige.

Fertig und Ende.
 
Nochmals vielen Dank :)

Und dank deiner Erklärung, insbesondere durch die Kommentare im
Quelltext habe ich jetzt, ausgeschlafen und ungestresst auch verstanden
wie es funktioniert.
 
Zurück
Oben