Hallo, Am Dienstag 13 Dezember 2005 20:13 schrieb Joerg Rossdeutscher:
@data=[ objectClass => [ "top", "person", "inetOrgPerson" ] , cn => $cn , sn => $nachname , homePhone => $telefon , mail => $email , givenName => $vorname , postalAddress => "$strasse , $plz , $ort" , postalCode => $plz , street => $strasse , o => $firma , l => $ort ];
Mein Problem: Es gibt einige Felder, die undefiniert seien können, z.B.: Telefonnummer nicht bekannt. LDAP erlaubt mir nicht, leere Felder dafür zu schreiben. Deswegen will ich obige Monstervariable leer initialisieren und nur die Attribute füllen, die tatsächlich definiert sind.
Es gelingt mir aber leider nicht, diese Struktur so zu entwirren, dass ich in etwa sowas habe:
@data=[]; # Leer machen
if ($mail) { $data[0]{'mail'} = $mail; } if ($phone) { $data[0]{'phone'} = $phone; } if ($plz) { $data[0]{'plz'} = $plz; } if ($handy) { $data[0]{'handy'} = $handy; } if ($ort) { $data[0]{'ort'} = $ort; } if ($firma) { $data[0]{'firma'} = $firma; }
use strict; use warnings; my @data=[ hallo => "ein hallo" ]; print @{$data[0]},"\n"; # "halloein hallo" print $data[0][1],"\n"; # "ein hallo" print $data[0]->[1],"\n"; # "ein hallo" print @{$data[0]},"\n"; # @data sollte ein Array von Hashs sein @data = { hallo => "besseres hallo" }; print $data[0]->{hallo},"\n"; # "besseres hallo" @data = {}; print $data[0]->{hallo},"\n"; # Error: Use of uninitialized value in print at test.pl line 18. $data[0]->{hallo} = "ebenso gutes hallo\n"; # Keinerlei Fehler print $data[0]->{hallo},"\n"; # "ebenso gutes hallo" Zur Erklärung: Dein nicht verstandenes @data enthält eine Referenz auf ein Array mit 22 Elementen (11 Paaren). '=>' ist ein Synonym für ','. Einen Hash gibt es da erstmal gar nicht (abgesehen davon, dass Hashs und Arrays beinah das selbe sind). Außerdem gibt es in Perl verschachtelte Datenstrukturen nur über Referenzen. Ein Array von Arrays ist eigentlich ein Array von Referenzen auf Arrays. Zum Dereferenzieren ist der Pfeil '->'. Bei verschachtelten Arrays kann der aber weggelassen werden, damit die Oneliner nicht zu lang werden.
sub LDAPentryCreate { my ($ldap, $dn, $whatToCreate) = @_; my $result = $ldap->add ( $dn, attrs => [ @$whatToCreate ] ); if ( $result->code ) { LDAPerror ( "Error", $result ); } return $result; }
...und weil da auch schon wieder sowas komisches drin ist: [ @ $whatToCreate ] ...bitte obigen Datentyp @data nicht ändern, denn dann weiss ich nicht, was hier hin gehört.
@$whatToCreate dereferenziert $whatToCreate als Array. Es ist eine Abkürzung für @{$whatToCreate}. Die [] erzeugen eine Referenz auf ein Array mit den Elementen von @{$whatToCreate} . Der Sinn davon bleibt mir gerade verschlossen. Ist $whatToCreate ein Element von @data? Wenn ja, könntest du @$whatToCreate durch %{$whatToCreate} ersetzen, damit meine obige Struktur funktioniert.
P.P.S.: Gibt es für perl sowas wie "print_r" unter php, das einem jede noch so komplexe Variable formatiert auf dem Bildschirm aufdröselt?
use Data::Dumper; Ich hoffe, das half. Arrays und Hashes verwirren mich auch immer wieder. Ferdinand