[Cologne-pm] Felder eines Arrays ausgeben

A. Pagaltzis pagaltzis at gmx.de
Thu Mar 11 06:26:04 CST 2004


* Robert Meiser <Robert.Meiser at rrz.uni-koeln.de> [2004-03-11 11:25]:
> Ich glaube wir reden aneinander vorbei. Deshalb noch mal die
> ganze Geschichte:
> 
> # "-" ist als "bis" zu verstehen
> 
> sub getFields  {  # Aufruf mit &getFields("F:O:O:B:A:R","-2","5","3-4","3-")
> 
> my ($Datensatz, at Params)=@_;
> @Datensatz=split (":",$Datensatz);
> 
> foreach $Param (@Params) {
>  ...
> 
>  # parse $Param von Benutzerfreundlicher Range z.B. "-2" durch splitten in
>  #    $Startrange="", $operator="-" und $Endrange="2"
>  # zu Arrayverträglicher Range mit
>  #    $Startrange="0", $operator=".." und $Endrange="2"
>  # $cleanparam=join ("", $Startrange,$operator,$Endrange)
>  ...
> }
> 
> Ziel ist nun mit
>   print @Datensatz[$cleanparam];
> die Ausgabe "FOO" zu erreichen

Gut, das war schonmal klarer.

> Mein Grundidee war einfach den Operator ".." zu nutzen um nicht
> per Schleife "4..10" in (4,5,6,7,8,9,10) verwandeln zu müssen.
> Wenn ich im Programmcode @array=(4..10) eingebe funktioniert
> das ja auch, wenn ich jedoch versuche die Range per Variable
> einzufüttern funktioniert es nicht.

Klar tut's das, s.o. Du schreibst die Punkte natürlich nicht in
einen String, sondern gibst die Start- und Endwert per Variable
vor.

    sub parse_range {
        my ($range, $upper_bound) = @_;

        local $_ = $range;

        if( /\A (\d+)? - (\d+) \z/x ) {
            return ($1 || 0) .. $2;
        }
        elsif( /\A (\d+) - \z/x ) {
            return $1 .. $upper_bound;
        }
        else {
            return $range;
        }
    }
    
    sub get_fields {
        my ($fields, @idx_range) = @_;
        my @fields = split /:/, $fields, -1;

        my @idx = map parse_range($_, $#fields), @idx_range;

        return join '', @fields[ @idx ];
    }

    print get_fields("F:O:O:B:A:R","-2","5","3-4","3-"), "\n";

Ergebnis "FOORBABAR", wie erwartet.

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



More information about the Cologne-pm mailing list