[Cologne-pm] Felder eines Arrays ausgeben

A. Pagaltzis pagaltzis at gmx.de
Thu Mar 11 00:28:26 CST 2004


* Robert Meiser <Robert.Meiser at rrz.uni-koeln.de> [2004-03-11 01:00]:
> Schon klar, aber wie kriege ich den String
>   $param ="0..3"
> in die Liste
>   (0..3)
> verwandelt?

Da musst du wohl die Arme hochkrempeln und parsen.

    sub parse_range {
        my ($range) = @_;
        if( $range =~ m/\A \s* (\d+) \s* \.\. \s* (\d+) \s* \z/x ) {
            return $1 .. $2;
        }
        return $range;
    }

    print join " ", parse_range(" 1 .. 4 ");

> foreach $param (@params) { # @params=(-2,2-3,1,6-)
                                           ^^^

Das verstehe ich nicht recht. Ist das im Original ein String,
meinst du eine SUbtraktion, oder was ist das bzw wie kommt der
Wert an der Stelle zustande?

>   $param = join ("", ($startfeld, $operator, $Endfeld)); # = x..y
>   push (@cleanparams,$param);
> }

Wo kommt $operator jetzt her?

    if($operator eq '..') {
        push @cleanparams, $startfeld .. $endfeld;
    }

> # @cleanparams ist nun  (0..2,2..3,1,6..$#Datensatz)
> 
> und versuche dann genau was du auch tust:
>   print  @Datensatz[@cleanparams];

Das geht dann falls du wie gezeigt die Zahlen direkt
draufgeschoben hast. Falls du aus irgendeinem Grunde deine
..-Notation beibehalten musst,

    print @Datensatz[ map parse_range($_), @cleanparams ];

> aber er scheint die einzelnen Elemente in @cleanparams
> ebenfalls als Zahl zu interpretieren. Wie gewöhne ich ihm das
> ab?
> 
> Kann leider gerade nicht testen, aber ist der Trick vielleicht
> ohne join alle parameterbestandteile einzeln zu pushen?

Da warst du schon nah dran, siehe oben. Du musst natürlich dafür
sorgen, dass eine Sequenz dabei entsteht, und nicht nur deren
Anfangs- und Endwerte auf die Liste kommen.

Probiere nicht soviel herum. *Lies*. Jeder Array-Index wird für
sich als Zahl interpretiert. Das steht in der Doku, und es steht
in jedem Perl-Buch, das sein Papier wert ist. Fertig, mehr gibt
es da nicht. Also musst du dich fragen, wie du eine Liste von
Indizes erstellst, die aus einzelnen Zahlen besteht, die die von
dir gewünschten Elemente indizieren. Rate nicht an der Syntax
herum -- das bringt nichts, und wenn etwas zufällig funktioniert,
weisst du in Wirklichkeit überhaupt nicht, warum. Nach der
nächsten Änderung oder bei unerwartetem Input tut es plötzlich
irgendwas völlig anderes. (eval() kann dir zB sehr schnell
Streiche spielen, wenn du dein Quoting nicht 100%ig im Griff
hast, und das hat niemand, selbst die allerbesten Programmierer
machen da Fehler.) Im (sehr empfehlenswerten) Buch "Der
pragmatische Programmierer" wird das als "Programmieren mit dem
Zufall" bezeichnet. Das Kapitel gibt es auch online zu lesen,
leider nur auf Englisch:
http://www.pragmaticprogrammer.com/ppbook/extracts/coincidence.html

-- 
Gruss,
Aristoteles
 
"Wer nicht über sich selbst lachen kann, nimmt das Leben nicht ernst genug."



More information about the Cologne-pm mailing list