Re: perl - mir unverstaendliche Variablenstruktur

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

-- 
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.