[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