Moin, Ich habe ein Problem mit perl. Folgende Variable verstehe ich nicht: @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 ]; LDAPentryCreate( $ldap, "cn=$cn,$people", @data ); 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; } LDAPentryCreate( $ldap, "cn=$cn,$people", @data ); Diese Syntax " $data[0]{'plz'} = $plz; " ist falsch. Wie lautet die richtige? Vor mir liegt ausgedruckt perlref, perldsc, perldata und perlvar randvoll mit den bescheuertsten ist-nicht-geil-was-alles-geht?- Beispielen , aber leide keine vernünftige Erklärung... Danke fürs Abhalten vom Freitod, Gruß, Ratti P.S.: Falls es wichtig ist: 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. 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? -- -- -o) fontlinge | Fontmanagement for Linux | Schriftenverwaltung in Linux /\\ http://freshmeat.net/projects/fontlinge/ _\_V http://www.gesindel.de https://sourceforge.net/projects/fontlinge/ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ red dot awards für hohe Designqualität ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Bei den red dot awards erhielten die Projekte A&W - Designer des Jahres 2005 und COR Lesereise awards für hohe Designqualität. Freuen Sie sich mit uns! +++++++++++++++++++++++++++++++++++++++++++++++++++++++
Hallo Ratti, hallo Leute, Am Dienstag, 13. Dezember 2005 20:13 schrieb Ratti:
Ich habe ein Problem mit perl. Folgende Variable verstehe ich nicht:
@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 ];
LDAPentryCreate( $ldap, "cn=$cn,$people", @data );
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; }
LDAPentryCreate( $ldap, "cn=$cn,$people", @data );
Diese Syntax " $data[0]{'plz'} = $plz; " ist falsch. Wie lautet die richtige?
Gute Frage - jedenfalls ist mir auf den ersten Blick unklar, woher Du das [0] hast. Probiers mal ohne ;-)
Vor mir liegt ausgedruckt perlref, perldsc, perldata und perlvar randvoll mit den bescheuertsten ist-nicht-geil-was-alles-geht?- Beispielen , aber leide keine vernünftige Erklärung...
;-)
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?
Du solltest öfter mal in fontlinge-devel reingucken *hint*. Ich zitiere beispielsweise eine Mail von David Haller vom 7.4.2005 ("Re: Indizies checken") | perldoc Data::Dumper hilft bei komplexen Datenstrukturen ungemein, | z.B. 'print Dumper(\%mein_hash)'. | | Achtung: Dumper erwartet eine Referenz auf die auszugebende Variable, | ansonsten nimmt es ein Hash z.B. als Liste auszugebender Variablen an. | | Also, wenn du ein Hash hast: 'print Dumper(\%hash)' und wenn man schon | eine Referenz hat: 'print Dumper($hashref)'. Weiter unten im Thread (19.4.2005) hat David dann auch ein Anwendungsbeispiel von Data::Dumper gezeigt. perldoc Data::Dumper' ist natürlich auch lesenswert ;-) Ach ja: use strict; use warnings; hast Du ja vermutlich schon, oder? Gruß Christian Boltz --
Bitkollisionen finden v.a. in Kneipen und Festzelten statt, würde ich mal annehmen. [H. Bengen] Und zu viele davon führen zu einem stomach overflow? [L. Barth]
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
Hallo, Am Tue, 13 Dec 2005, Joerg Rossdeutscher schrieb:
Ich habe ein Problem mit perl. Folgende Variable verstehe ich nicht:
Ich glaube eher, derjenige, der den Kot unten verbrochen hat... *VBEG*
@data=[
Hier ist schonmal ein Kardinalsfehler. '@foo' ist eine Arrayvariable. '= []' liefert aber eine anonymes Array-*REFERENZ*! Korrekt waere: @foo = ( ... ); oder @foo = qw¡ ... ¡; ## statt ¡..¡ darf jedes andere Zeichenpaar oder ein ## Klammerpaar (), {} oder [] stehen. Siehe 'perldoc -f qw'. Verwendet wird aber @data wiederrum wie ein Hash. Aber auch da ist [] falsch. Korrekt waere also: %data = (
objectClass => [ "top", "person", "inetOrgPerson" ] ,
Hier wiederum ist die Verwendung von [] korrekt.
cn => $cn , sn => $nachname , homePhone => $telefon , mail => $email , givenName => $vorname , postalAddress => "$strasse , $plz , $ort" , postalCode => $plz , street => $strasse , o => $firma , l => $ort ];
Hier gehoert also ein ');' hin. Nochmal: %data = ( objectClass => [ ... ], l => $ort );
LDAPentryCreate( $ldap, "cn=$cn,$people", @data );
Ich weiss nicht, welche Argumente LDAPentryCreate erwartet, hier liegt aber ein weiterer potentieller (Folge-)Fehler.
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.
LDAP (als Interface/Datenbank) oder das Perlmodul? Ggfs. wuerde ich eine "leere" Struktur erzeugen: $data{'objectClass'} = [ "", "", "" ]; for $key in qw( cn, ..., l ) { $data{$key} = ""; }
Es gelingt mir aber leider nicht, diese Struktur so zu entwirren, dass ich in etwa sowas habe:
@data=[]; # Leer machen
Auch das ist falsch. s.o. undef %data;
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; }
*argsl* Das ganze if gewurstel ist ueberfluessig, es sei denn, das LDAP-Perl-Modul (welches?) macht Aerger (s.o.). Und auch dann kann man das wohl vereinfachen. 'map' faellt mir da ein. @ldapfields = qw( mail phone plz handy ort firma ); map { eval "\$$data{$_} = \$$_ || \"\"" ; } @ldapfields; oder sowas aehnliches "krankes" (alles ungetestet!) ;)
LDAPentryCreate( $ldap, "cn=$cn,$people", @data );
Diese Syntax " $data[0]{'plz'} = $plz; " ist falsch. Wie lautet die richtige?
s.o. Es geht um einen Hash. Sollte tatsaechlich ein @data gemeint gewesen sein, also eine "list of hashes of ...", haette das so aussehen muessen: @data = ( { objClass => [ .. ], ... l => 'foo' }, { objClass => [ .. ], ... l => 'bar' } ); Das ist aber nicht der Fall.
Vor mir liegt ausgedruckt perlref, perldsc, perldata und perlvar randvoll mit den bescheuertsten ist-nicht-geil-was-alles-geht?- Beispielen , aber leide keine vernünftige Erklärung...
Danke fürs Abhalten vom Freitod,
*g*
P.S.: Falls es wichtig ist:
sub LDAPentryCreate { my ($ldap, $dn, $whatToCreate) = @_; my $result = $ldap->add ( $dn, attrs => [ @$whatToCreate ] ); if ( $result->code ) { LDAPerror ( "Error", $result ); } return $result; }
Und was ist $ldap?
...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 ist auf jedenfall sinnlos, denn nach obigem Code waere das @data, also ein Array(!), das @$whatToCreate wiederum als Array dereferenziert und daraus (als Kopie) ein anonymes Arrayref (via []) erzeugt. Da kann man (wenn denn $whatToCreate wirklich ein Arrayref waere) auch gleich 'attrs => $whatToCreate' verwenden... Aeh, *ARGS*, *BLUBB*, mir kommt das alles _MEHR_ als chaotisch vor, und zwar weniger deinerseits... Ich geb auf. "Denn sie wissen nicht was sie tun"... Mail "mindestestens" noch, welche Module du einbindest ('use'). Und wie du die verwenden willst bzw. was du erreichen willst. Ich habe hier allerdings keinen LDAP-Server am laufen.
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?
perldoc Data::Dumper print Data::Dumper(\@data); -dnh -- Wir haben uns @work darauf geeinigt, dass das verwendete Echtzeit- Betriebssystem wohl deswegen diese Gattungbezeichnung trägt, weil selbst einfachste Operationen *echt* *Zeit* brauchen. -- Stefan Reuther
Hallo, Am Tue, 13 Dec 2005, Joerg Rossdeutscher schrieb:
Vor mir liegt ausgedruckt perlref, perldsc, perldata und perlvar randvoll mit den bescheuertsten ist-nicht-geil-was-alles-geht?- Beispielen , aber leide keine vernünftige Erklärung...
Nachtrag: Schau dir auch noch perlreftut an. -dnh --
How would one crash packaging? Unexpected end-of-roll on /dev/bubblewrap System halted. -- A. D. Barratt, Tanuki
Hi Joerg, Joerg Rossdeutscher wrote:
Moin,
Ich habe ein Problem mit perl. Folgende Variable verstehe ich nicht:
@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 ];
Du weisst dass "=>" das gleiche ist wie "," ?? So machst du hier nur eine riesen Liste (angedeutet durch die eckigen Klammern). Die "=>" werden hier ausgewertet wie Kommas. Da ist also kein Hash drin, wie du es evtl. wolltest. Darum kannst du auch nicht mit $data[0]{mail} oder $data{mail} darauf zugreifen. auf die eMail-adresse kannst du nur zugreifen über data[9], da es das 10. Element ist. Was du vermutlich willst ist: $data = { objectClass => [ "top", "person", "inetOrgPerson"] , cn => $cn , ... usw. } Mit geschweiften Klammern ist das nämlich ein Hash. Anstatt auf deinem @$whatToCreate zu beharren solltest du dir evtl. einmal die Mühe machen, nachzusehen, welche Parameter "$ldap->add" wirklich erwartet.
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?
Was sich dazu hervorragend eignet ist Data::Dumper. Aus dem CPAN installieren und dann zB. folgendermaßen benutzen: use Data::Dumper; @data = ...deine komische Struktur print STDERR "Here is my data\n" print STDERR Data::Dumper->Dump([@data], ["Data"]); oder print STDERR Data::Dumper->Dump([\@data], ["Data"]); Data::Dumper gibt dir beliebige Variablen sehr schön Formatiert aus. Damit erkennt man dann auch versehentlich falsch zusammengesetzte Hash- und Array-Konstrukte. Ciao, Daniel Schmidt
participants (5)
-
Christian Boltz
-
David Haller
-
Ferdinand Ihringer
-
Jens Daniel Schmidt
-
Joerg Rossdeutscher