Re: perl - mir unverstaendliche Variablenstruktur

David Haller <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
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

-- 
Um die Liste abzubestellen, schicken Sie eine Mail an:
    [email protected]
Um eine Liste aller verfÃŒgbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.