WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Perl - Frage (http://www.wcm.at/forum/showthread.php?t=72331)

PredeX 04.10.2002 16:13

Perl - Frage
 
Hi,

ich versteh da ein stücken Code ned, dass ich in einem Inet-Tutorial gsehn hab, und bitte um Erklärung erfahrenerer PerlProgrammierer als ich es bin :)

Code:

#!/usr/bin/perl -w

@zeichen = ('A'..'Z', 'a' .. 'z', 0 .. 9);
$passwort = join("", @zeichen[map{rand @zeichen}(1 .. 8)]);

print "Ihr Passwort : $passwort\n";

Wieso sind da eckige KLammern nach dem Array @zeichen?? und nur um sicherzustellen um ich da richtig liege: bei map legt man ja zuerst einen Ausdruck, der die Elemente des nachfolgenden Arrays, verändert. In diesem Fall dient dieser Array dazu, dass das Passwort aus 8 Zeichen bessteht oder??

Danke schon im voraus

Mfg
Sebastian Gabmeyer aka PredeX

_m3 04.10.2002 18:46

map erwartet eine expression und eine Liste als Parameter, wobei die Espression auf jeden Wert der Liste angewendet wird.
Die Expression steht innerhalb der {} - die Liste ist das "(1..8)".

IMHO ist bei "rand @zeichen" das "@zeichen" unnötig und könnte durch "62" ersetzt werden, da @arryname im skalaren Kontext die Länge des Arrays zurückliefert.

Jedenfalls wird "rand 62" 8 mal aufgerufen => es entsteht eine liste (array) aus 8 Kommazahlen.

Die Notation @array[index1, index2, ....] beschreibt einen Bereich (slice) eines Arrays. z.b würde "@array[1,2,5]" eine Liste (Array) bestehend aus dem ersten, zweiten und fünften Element das Arrays @array zurückliefern.
Genauso ist es in diesem Fall. Die Kommastellen der 8 Kommazahlen werden abgeschnitten und stellen somit eine Liste von 8 Indexwerten dar, über die 8 Elemente des Arrays @zeichen ausgewählt werden und als Liste (array) zurückgekliefert werden.
Mit join macht man dann aus dem Array noch einen String.

Alles klar?

PredeX 07.10.2002 01:08

Also mal danke für die tolle Erklärung, an slices hab ich nämlich überhaupt ned dacht und an den sklaren Kontext von @zeichen in rand @zeichen schon gar ned :)

Aber dennoch hab ich eine Frage: Wieso/wodurch werden bei den acht durch die von rand generierten Zahlen die Kommastellen abgeschnitten??

MfG

PredeX

allwissende Müllhalde 07.10.2002 03:15

Meine rudimentären Programmierkentnisse sagen mir daß Du
oben mit
@zeichen = ('A'..'Z', 'a' .. 'z', 0 .. 9);
definiert hast welche Werte gültig sind, eben 0 - 9 ganze Zahlen
(oder ist das ein Array ?) - in dem ja dann nichts anderes drinnen ist als diese Möglichkeiten also auch nichts anderes herausgeholt werden kann.
Naja, heute früh wird sich schon jemand melden der es (sicher) weiß

_m3 07.10.2002 05:29

@am: das hat nixh mit dem array @zeichen zu tun.

Slices wollen als index nur Integers. Damit führt Perl automatsisch eine Typenkonvertierung (Gleitkomma -> Integer) in Form des Abschneidens der Kommastellen durch.

PredeX 07.10.2002 10:34

thx _m3

MfG
Sebastian Gabmeyer aka PredeX


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag