Hash Probleme nach Einlesen mit XML::Simple
Stefan
- perl
0 Jens Müller0 Stefan
Hallo,
ich lese ein XML File mit XML::Simple XMLin() ein. Das erzeugt mir ein großes Hash mit lauter kleinen Hashs ;-)
Will ich ein bestimmtes Element lesen, so tue ich das z.B. mit
if (defined %{$xml->{'options'}->{'size'}})
{
# yes, hashref: write ''
print "var size = "";\n";
}
else
{
# no, skalar: assign value
print "var size = ",$xml->{'options'}->{'size'},";\n";
}
Hat size im XML File einen Wert (<size>3.456</size>), wird dieser mit print ausgegeben, ist der Wert "leer" (<size></size>) (XMLin erzeugt dann eine hashreferenz, die ich mit 'defined' erkennen will) dann wird '' zugewiesen.
Funktioniert lokal alles super unter WinXP, Apache, strict refs
Leider nicht auf dem Server (Unix, Netscape Webserver, ...). Dort funktioniert das Abfangen der Hashreferenz wenn size leer ist, aber wenn ein Wert drin steht, dann kommt die Fehlermeldung
Can't use string ("3.456") as a HASH ref while "strict refs" in use at ... für die Zeile, in der ich mit 'defined' die Hashreferenz erkennen will.
Was mache ich falsch, und warum bekomme ich diese Fehlermeldung nicht bei mir, wenn ich doch strict refs eingeschaltet habe?
Gruß,
Stefan
Morgen Stefan,
Funktioniert lokal alles super unter WinXP, Apache, strict refs
Leider nicht auf dem Server (Unix, Netscape Webserver, ...).
Dort funktioniert das Abfangen der Hashreferenz wenn size leer
ist, aber wenn ein Wert drin steht, dann kommt die Fehlermeldung
Can't use string ("3.456") as a HASH ref while "strict refs" in
use at ... für die Zeile, in der ich mit 'defined' die
Hashreferenz erkennen will.
Ist recht einfach, auf dem Server ist ne Alte Version. Aeltere
Versionen von XML-Simple sind nicht Strict Kompatibel.
Check mal die Version auf dem Server, unter 2.00 solltest
du die Ersestzen, oder Erstetzen lassen.
http://search.cpan.org/src/GRANTM/XML-Simple-2.07/Changes
Die Aktuelle Version 2.07 hat noch ein paar Aenderungen die mit
Strict zusammen haengen.
http://search.cpan.org/dist/XML-Simple/
gruesse
jens mueller
Hallo Jens,
Ist recht einfach, auf dem Server ist ne Alte Version. Aeltere
Versionen von XML-Simple sind nicht Strict Kompatibel.
Check mal die Version auf dem Server, unter 2.00 solltest
du die Ersestzen, oder Erstetzen lassen.
http://search.cpan.org/src/GRANTM/XML-Simple-2.07/ChangesDie Aktuelle Version 2.07 hat noch ein paar Aenderungen die mit
Strict zusammen haengen.
Um ehrlich zu sein, ich selbst benutze 1.10 (oder so??) und auf dem Server ist irgend ne zweier Version. Das würde bedeuten, dass doch ein Fehler in der Zeile
if (defined %{$xml->{'options'}->{'size'}})
ist, der auf dem Server angezeigt wird und bei mir wegen der alten Version nicht???
Hast Du einen besseren Vorschlag, wie man testen kann, ob 'size' ein
string oder eine hash-referenz ist?
Leider habe ich schon versucht, meine XML::Simple auf 2.0 upzugraden, aber erfolglos, bricht immer mit Fehlermeldung ab.
Viele Grüße,
Stefan
Halihallo Stefan
if (defined %{$xml->{'options'}->{'size'}})
ist, der auf dem Server angezeigt wird und bei mir wegen der alten Version nicht???
Hast Du einen besseren Vorschlag, wie man testen kann, ob 'size' ein
string oder eine hash-referenz ist?
perldoc -f ref
Leider habe ich schon versucht, meine XML::Simple auf 2.0 upzugraden, aber erfolglos, bricht immer mit Fehlermeldung ab.
Welche?
Viele Grüsse
Philipp
Hi Philipp,
perldoc -f ref
glaubst Du mir, dass ich perldoc zum Thema ref schon gelesen habe? ;-)
Besitze auch mehrere Perl-Bücher (O'Reily) und habe dort fleißig gelesen zum Thema referenzieren und dereferenzieren. Habe leider jetzt einen Knoten im Kopf und weiß trotzdem nicht, ob
if (defined %{$xml->{'options'}->{'size'}})
nun richtig oder falsch ist ;-(((
Kannst Du es mir nicht sagen? *hoff*
Leider habe ich schon versucht, meine XML::Simple auf 2.0 upzugraden, aber erfolglos, bricht immer mit Fehlermeldung ab.
Welche?
Weiß nicht mehr, ist schon so lange her. Mach ich aber nochmal und poste das nochmal als extra Thread.
Gruß,
Stefan
Halihallo Stefan
perldoc -f ref
glaubst Du mir, dass ich perldoc zum Thema ref schon gelesen habe? ;-)
Ich bin per Definition und aus Erfahrung ungläubig :-))
Besitze auch mehrere Perl-Bücher (O'Reily) und habe dort fleißig gelesen zum Thema referenzieren und dereferenzieren. Habe leider jetzt einen Knoten im Kopf und weiß trotzdem nicht, ob
OK, ein bestätigter Glaube ist zumindest eine These, also weiter... :-)
if (defined %{$xml->{'options'}->{'size'}})
nun richtig oder falsch ist ;-(((
Äm, in welchem Kontext verstehst du hier richtig/falsch noch einmal? - Du wolltest doch
wissen, ob dieser "Knoten" ein string oder eine Hash-Referenz ist, oder?
Nun, allgemein: Es ist nicht richtig, da vom Kontext abhängig; bei no use strict geht
das, bei use strict nicht immer...
Wenn du auf die Existenz des Knotens prüfen möchtest, verwende:
if (defined $xml->{'options'}->{'size'}) {...}
wenn du wissen möchtest, ob der Knotenpunkt eine Hash-Ref ist:
if (ref($xml->{'options'}->{'size'}) eq 'HASH') {...}
Kannst Du es mir nicht sagen? *hoff*
Wenn ich dich richtig verstanden habe, ja, meistens :-)
---
Ansonsten darf ich dir XML::DOM oder XML::SAX ans Herz legen, dann hast du diese
Probleme nicht mehr (dafür andere, hehe)... ;)
Viele Grüsse
Philipp
Hallo Philipp,
Äm, in welchem Kontext verstehst du hier richtig/falsch noch einmal? - Du wolltest doch
wissen, ob dieser "Knoten" ein string oder eine Hash-Referenz ist, oder?
genau
wenn du wissen möchtest, ob der Knotenpunkt eine Hash-Ref ist:
if (ref($xml->{'options'}->{'size'}) eq 'HASH') {...}
Kann das gerade nicht prüfen, sieht aber aus als wenn es ganau das ist, wonach ich gesucht habe. Danke!
Ansonsten darf ich dir XML::DOM oder XML::SAX ans Herz legen, dann hast du diese
Probleme nicht mehr (dafür andere, hehe)... ;)
Ich wollte ja schon upgraden auf XML::SAX, aber wie gesagt hatte ich Probleme mit der Installation... Mache ich aber nochmal.
Also vielen Dank und Gruß,
Stefan