(PERL) hmm, get das nicht irgendwie besser?

Hi,

hab hier nen Code programmiert, der mir so nicht gefällt. Das geht bestimmt irgendwie ‚komprimierter‘. Das Problem ist nur, das ich die Arrays brauche, ach schaut einfach hier:

@defense1 = split(/\,/,$data{"1\_defense"});
@defense2 = split(/\,/,$data{"2\_defense"});
@defense3 = split(/\,/,$data{"3\_defense"});

@offense1 = split(/\,/,$data{"1\_offense"});
@offense2 = split(/\,/,$data{"2\_offense"});
@offense3 = split(/\,/,$data{"3\_offense"});

@ringer1 = split(/\,/,$data{"1\_ringer"});
@ringer2 = split(/\,/,$data{"2\_ringer"});
@ringer3 = split(/\,/,$data{"3\_ringer"});

@coordinator1 = split(/\,/,$data{"1\_coordinator"});
@coordinator2 = split(/\,/,$data{"2\_coordinator"});
@coordinator3 = split(/\,/,$data{"3\_coordinator"});

$data{'1\_report'} =~ s/\n/
/g;
$data{'2\_report'} =~ s/\n/
/g;
$data{'3\_report'} =~ s/\n/
/g;

ich könnt wetten, das es da ne bessere Lösung gibt für oder?

Martin

besser…
ReHi,

Du könntest Zeiger verwenden um die Datenstruktur zu vereinfachen, aber eine große Kürzungsmöglichkeit sehe ich nicht solange du alle Werte explizit zuweist.

cu, holli

hi,

$data{„1_defense“} = „ab,cd,ef“;

my($key);
foreach $key (keys %data)
{
my($saveaskey)=$key;
$saveaskey =~ m/^(\d+)/sg;
my($num)=$1;
$saveaskey =~ s/^_([a-z]+)$/$1$num/i;
@{$saveaskey} = split(/,/,$data{$key});
}

print $defense1[1];

gerhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hi,

Hi,
wow. Sieht nett aus :smiley:. Kannst Du mir das auch irgendwie erklären? Damit ich das auch verstehen lerne? *hoff*
Ich versuche mal das zu erklären, was ich schon weiss.

$data{„1_defense“} = „ab,cd,ef“;

kar, Deklaration der Hash-Variable. Hash data{„1_defense“} hat jetzt den Wert „ab,cd,ef“

my($key);

Initialisierung von $key

foreach $key (keys %data)

mhhh da fängts schon an aufzuhören. 'foreach is ja klar, aber mit dem wort ‚keys‘ in der Klammer kann ich nichts anfangen. Außerdem dachte ich immer, das foreach nur mit Arrays geht.

{
my($saveaskey)=$key;

variablendeklaration von $saveaskey. Der jetzt den wert von $key (foreach schleife) hat.

$saveaskey =~ m/^(\d+)/sg;

hehe, kein plan was hier passiert. ich kenne dieses ‚=~ m‘ nicht. Ich kenne nur ‚=~ s‘ (ersetzen von bestimten stellen durch andere in einem Skalar)

my($num)=$1;

Ebenfalls keine Ahnung. Was hat das $1 zu bedeuten?

$saveaskey =~ s/^_([a-z]+)$/$1$num/i;

mhhh, sieht gut aus, kann ich das auch für mein Toaster gebrauchen :wink:
hehe, Scherz beiseite. Der ersetzt hier Kleinbuchstaben von a bis z durch irgendetwas oder? Aber durch was denn?

@{$saveaskey} = split(/,/,$data{$key});

gut, das ich mir klar. Hier wird an einem ‚,‘ gesplittet. Aber die Variable @{$saveaskey} … ist das jetzt nen Hash oder nen Array? Oder beides? *grübel*

}

print $defense1[1];

hehe, das bekomm ich hin :wink:

Jo, Du sieht, mir ist das noch ne Nummer zu hoch. Aber ich versuche den Code zu verstehen. Denn erst dann bin ich in der Lage daraus etwas zu lernen. Vielleicht kannst Du mir die Passagen, mit den ich nichts anfangen kann, mal kurz erklären?

gruss,
Martin

Hallo,

wow. Sieht nett aus :smiley:. Kannst Du mir das auch irgendwie
erklären? Damit ich das auch verstehen lerne? *hoff*
Ich versuche mal das zu erklären, was ich schon weiss.

$data{„1_defense“} = „ab,cd,ef“;

kar, Deklaration der Hash-Variable. Hash data{„1_defense“} hat
jetzt den Wert „ab,cd,ef“

my($key);

Initialisierung von $key

foreach $key (keys %data)

mhhh da fängts schon an aufzuhören. 'foreach is ja klar, aber
mit dem wort ‚keys‘ in der Klammer kann ich nichts anfangen.
Außerdem dachte ich immer, das foreach nur mit Arrays geht.

OK. Ein Hash ist eigentlich ein Array, ich erklär das mal mit einem Beispiel:
$test{‚vorname‘} = ‚gerhard‘;
$test{‚email‘} = ‚[email protected]‘;

wird intern als Array mit den Elementen
vorname,gerhard,email,[email protected]
gespeichert.

Das Keyword „keys“ bedeutet, dass ich aus dem Hash %data nur die Keys haben möchte.

{
my($saveaskey)=$key;

variablendeklaration von $saveaskey. Der jetzt den wert von
$key (foreach schleife) hat.

$saveaskey =~ m/^(\d+)/sg;

hehe, kein plan was hier passiert. ich kenne dieses ‚=~ m‘
nicht. Ich kenne nur ‚=~ s‘ (ersetzen von bestimten stellen
durch andere in einem Skalar)

Der =~m ist ein „match“-Operator. D.h. ich versuche vom Anfang an (das ist das ^) mindestens eine (das ist das + danach) Ziffer (das ist das \d) zu finden.
Da ich das \d+ in runde Klammern setzte, merkt sich Perl den gefundenen Teil in der Variable $1. Würde ich mehrere Klammern verwenden,
so wären diese in $1, $2, $3 … abgelegt. Da Regular Expressions immer ein „maximum match“ machen, also soviele Zeichen wie möglich einpacken, habe ich auch bei mehrstelligen Nummern die ganze Zahl.

my($num)=$1;

Ebenfalls keine Ahnung. Was hat das $1 zu bedeuten?

Das $1 kommt von der obigen Zeile und enthält die Zahl des Keys, bei 1_defense also die 1

$saveaskey =~ s/^_([a-z]+)$/$1$num/i;

mhhh, sieht gut aus, kann ich das auch für mein Toaster
gebrauchen :wink:

Das kann sogar das Geschirr abwaschen. Musst es nur in die Spüle schreiben :wink:)

hehe, Scherz beiseite. Der ersetzt hier Kleinbuchstaben von a
bis z durch irgendetwas oder? Aber durch was denn?

Naja, seh grad, da ist ein fehler drin. muss nämlich lauten:
$saveaskey =~ s/^\d+_([a-z]+)$/$1$num/i;

(ist aber eh klar :wink: )
also, ich suche im saveaskey nach dem Beginn (^) von Ziffern (\d) gefolgt von einem Underscore (_) und dann beliebig vielen
Buchstaben ( [a-z]+ ) wobei ich möchte dass Perl sich die Buchstaben merkt ( also ([a-z]+) legt das in $1 oder auch \1 ab). Das $ am Ende der Suchoperation bedeutet, dass bis ans Ende von saveaskey Buchstaben sein müssen.
Und ersetzen tu ich den gefundenen String durch die Buchstaben ($1) gefolgt von der Zahl ($num) die ich mir oben gemerkt habe.
Man könnte das auch auf einer zeile machen:

$saveaskey = $key;
$saveaskey =~ s/^(\d+)_([a-z]+)$/$2$1/i;

@{$saveaskey} = split(/,/,$data{$key});

gut, das ich mir klar. Hier wird an einem ‚,‘ gesplittet. Aber
die Variable @{$saveaskey} … ist das jetzt nen Hash oder nen
Array? Oder beides? *grübel*

Naja, ich weise einem Array @ mit dem Namen, welcher in den geschwungenen Klammern steht die Werte der split-Operation zu.
Also, wenn $saveaskey jetzt den Wert ‚defense1‘ hat, mache ich ein Array @defense1 damit.

}

print $defense1[1];

hehe, das bekomm ich hin :wink:

Jo, Du sieht, mir ist das noch ne Nummer zu hoch. Aber ich
versuche den Code zu verstehen. Denn erst dann bin ich in der
Lage daraus etwas zu lernen. Vielleicht kannst Du mir die
Passagen, mit den ich nichts anfangen kann, mal kurz erklären?

Ich hoffe du hast noch viel spass mir perl,
liebe grüsse,
gerhard

$saveaskey =~ m/^(\d+)/sg;

hehe, kein plan was hier passiert. ich kenne dieses ‚=~ m‘
nicht. Ich kenne nur ‚=~ s‘ (ersetzen von bestimten stellen
durch andere in einem Skalar)

Das is das gleiche wie ohne m, mit m kann man aber auch andere Zeichen als / für den regulären Ausdruck verwenden, z.b. m#^(\d+)#sg;

Bruno