Schrift
[thread]12532[/thread]

Frage zu Array-Code



<< >> 9 Einträge, 1 Seite
Ted
 2008-09-23 10:19
#114857 #114857
User since
2008-01-09
22 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich habe eine Frage zu folgendem Code.
Kann mir jemand genau erklären was da passiert.
Soweit wie ich das verstanden habe, wird eine Referenz auf einen Array erzeugt, aber ich verstehe nicht genau den Zusammanhang.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
 my $CreateArray = [
   objectClass => [ "top", "person", "organizationalPerson", "inetOrgPerson" ],
   cn => "Jane User",
   uid => "0000001",
   sn => "User",
   mail => "JaneUser\@mycompany.com"
 ];

 print "@$CreateArray[2]\n"; 


MfG
FIFO
 2008-09-23 10:38
#114858 #114858
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Ted+2008-09-23 08:19:50--
Code (perl): (dl )
1
2
3
4
5
6
 my $CreateArray = [
   objectClass => [ "top", "person", "organizationalPerson", "inetOrgPerson" ],
   ...
 ];

 print "@$CreateArray[2]\n"; 


Hoppla, da wird per $CreateArray = [ ... ] zwar eine Array-Referenz erzeugt, dann aber mit Hash-Inhalten key => 'value' gefüllt, wobei der Wert zu 'objectClass' wiederum eine Array-Referenz ist.
Gedacht war vielleicht eine Hash-Referenz $CreateArray = { ... }, dann muss die Dereferenzierung im print-statement ebenfalls anders erfolgen.
Zu Referenzen und komplexen Datenstrukturen: perldsc

Gruß FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
renee
 2008-09-23 10:45
#114859 #114859
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@FIFO: Das => ist ein "fat comma", d.h. der linke Wert wird automatisch gequotet. Der Code entspricht einem

Code (perl): (dl )
1
2
3
4
my $CreateArray = [
    'objectClass', [ "top", "person", "organizationalPerson",...]
    ...
];


Aber Du hast recht, vom Inhalt her scheint eher ein Hash als ein Array gewollt zu sein.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FIFO
 2008-09-23 11:13
#114860 #114860
User since
2005-06-01
469 Artikel
BenutzerIn

user image
@renee: Fat comma und Autoquoting ist schon klar, ebenfalls die Listenäquivalenz von Hashes, aber die genannte Konstruktion mit Absicht zu verwenden, ist schon mutig ;-)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Ted
 2008-09-23 11:22
#114861 #114861
User since
2008-01-09
22 Artikel
BenutzerIn
[default_avatar]
Hallo,

schon mal danke für eure Antworten.

Ich habe den Code von folgender Seite

http://search.cpan.org/~gbarr/perl-ldap-0.38/lib/N...

Da ich gerade einige LDAP Funktionen schreibe, wollte ich den Code verstehen.
Welche Möglichkeiten habe ich denn, den Code anders zu schreiben.

MfG
skirnir
 2008-09-23 11:40
#114862 #114862
User since
2006-05-09
29 Artikel
BenutzerIn
[default_avatar]
FIFO+2008-09-23 09:13:41--
..., aber die genannte Konstruktion mit Absicht zu verwenden, ist schon mutig ;-)

Kannst du etwas näher darauf eingehen, inwiefern das "mutig" ist, sprich, welche Gefahren das birgt?
renee
 2008-09-23 12:04
#114863 #114863
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Gefahren? Nicht wirklich. Es kann höchstens etwas verwirren, weil man das => meistens in Hash findet und weniger bei Arrays.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
FIFO
 2008-09-23 12:13
#114864 #114864
User since
2005-06-01
469 Artikel
BenutzerIn

user image
mutig ist vielleicht das falsche Wort ... der Charme am Hash ist ja gerade, dass ich die innere Anordnung der Liste (und Hashes sind auch nur eindimensionale Listen) nicht kennen muss, um auf einen Wert zuzugreifen.
Zu Deinem Beispiel:
OK, die Verwendung einer Arrayreferenz macht hier das Zusammensetzen des DN-Strings übersichtlicher ...
Wie renee schon sagte, ergibt sich aus der Verwendung der key-value-Paare eine flache Liste, dabei ist der erste key das Listenelement 0, der erste value Element 1, usw.
Zugegriffen wird dann direkt auf die Listenelemente, dabei muss die Position in der Liste bekannt sein. Bei Verwendung der Hash-Syntax wird auf Werte über ihren Schlüsselnamen zugegriffen. Wenn Du Net::LDAP verwendest, musst Du der angegebenen Syntax folgen, weil die Methode ->add() diese verlangt. edit: Das heißt natürlich, dass Du den Array auch als 'normale' Liste übergeben kannst. Das zweite Element muss allerdings eine Referenz sein
Im Beispiel wird der DN-String zusammengesetzt aus:
dem 3. Element (Index 2) des Arrays (welches durch $CreateArray referenziert wird), also 'cn', danach ein '=', dann das Element mit Index 3, also 'Jo user' usw.

Die Methode add() erwartet als value bei dem Argument 'attr' dann eine anonyme Liste, die hier gefüllt ist mit den Elementen des durch $CreateArray referenzierten Arrays ... tricky ;-)

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 # create the  new DN to look like this
 # " cn=Jo User + uid=0000001 , ou=bailiwick, o=mycompany, c=mycountry "

 my $NewDN = "@$CreateArray[2]=".
             "@$CreateArray[3]+".
             "@$CreateArray[4]=".
             "@$CreateArray[5],".
             $DNbranch;

 LDAPentryCreate($ldap, $NewDN, $CreateArray);

 #
 # CreateArray is a reference to an anonymous array
 # you have to dereference it in the  subroutine it's
 # passed to.
 #

 sub LDAPentryCreate
 {
    my ($ldap, $dn, $whatToCreate) = @_;
    my $result = $ldap->add ( $dn, attrs => [ @$whatToCreate ] );
    return $result;
 }
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Gast Gast
 2008-09-23 19:07
#114884 #114884
ich finde
Code (perl): (dl )
print "@$CreateArray[2]\n";
nicht so toll besser währe doch
Code (perl): (dl )
print "$$CreateArray[2]\n";
oder
Code (perl): (dl )
print "$CreateArray->[2]\n";
<< >> 9 Einträge, 1 Seite



View all threads created 2008-09-23 10:19.