Re: [perl] zuordnungsprobl em [auf Viren überprüft]
David Haller <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Message-ID | <[email protected]> |
Hallo,
Am Wed, 15 Feb 2006, Jan Trippler schrieb:
>Am Mittwoch, 15. Februar 2006 17:26 schrieb Hans Moser:
>> Ich habe einen Datensatz aus mit Komma getrennten Werten:
>> feld1;wert1;feld2;wert2;feld3;wert3;
>>
>> Daraus einen Hash zu bilden, wÀre ja nicht das Problem.
>> Letztendlich soll daraus ein LDIF-Datensatz werden. Dazu muà ich
>> die Feldnamen anhand einer weiteren Zuordnung in die
>> entsprechenden Attribute Àndern.
>> feld1 -> attribute1
>> feld2 -> attribute2
>>
>> Wie verknÃŒpfe ich am besten die Ausgangs"tabelle" mit meiner
>> LDIF-Ãbersetzungs"tabelle", damit ich folgende Zuordnung erhalte:
>> feld1 - wert1 ---> attribute1 - wert1 ?
>> Ein Hash mit einem 2 dimensionalen Array?
>
>Meinst Du sowas?
>
><schnipp>
>#! /usr/bin/perl
>
>use strict;
>use warnings;
>
>my %ldif = ("feld1" => "attribute1",
> "feld2" => "attribute2",
> "feld3" => "attribute3");
>
>my $line = "feld1;wert1;feld2;wert2;feld3;wert3;";
>my %out = ();
>
>my @f = split /;/, $line;
>for (my $i = 0; $i < $#f; $i+=2) {
> my @a = ($ldif{$f[$i]}, $f[$i+1]);
> $out{$f[$i]} = \@a;
>}
>
>foreach (sort keys %out) {
> my $aref = $out{$_};
> print $_, " = ", @$aref[1], " ---> ", @$aref[0], " = " ,
> @$aref[1], "\n";
>}
>
>exit 0;
><schnapp>
Man kann auch ausnuetzen, dass ein hash nur eine Sonderform eines
Arrays ist...
====
#!/usr/bin/perl -w
use strict;
my %ldif = ("feld1" => "attribute1",
"feld2" => "attribute2",
"feld3" => "attribute3");
my %o;
my %l = split(';', $line);
map { $o{ $ldif{$_} } = $l{$_}; } keys %l;
print map { "$_ = $o{$_}\n"; } sort keys %o;
====
*SCNR*
BTW: 'map' und 'grep' sind verdammt nuetzliche Funktionen, die ich
lange unterschaetzt habe und ich denke das geht vielen so. Ein
Beispiel aus dem Kochbuch um ein Array "uniq" zu machen:
my %seen; my @array = qw( foo bar baz bla fasel laber );
my @uniqed = grep { ! $seen{$_}++ } @array;
Grad vorhin so gemacht mit einer Liste von Zeilen die zusammen in "$_"
stehen:
print join("\n", grep { $_ && ! $seen{$_}++ } split('\n')), "\n";
Das ueberspringt auch gleich noch Leerzeilen. Fuer 'map' hats ja oben
zwei Beispiele :)
-dnh
PS: Jan, ich vermisse unsere script-Feilereien ;)
--
>This is *not* a drill. -- WDOA
This, however, is a drill. You remember how you said you needed that
'upgrade' like you needed a hole in the head?
*wanders off to find "trepaning for beginners"* -- Aquarion
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
[email protected]
Um eine Liste aller verfÃŒgbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]