Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]392[/thread]

regex für Umlaute (de, en, fr): Geht das auch besser? (Seite 5)



<< |< 1 2 3 4 5 >| >> 47 Einträge, 5 Seiten
steffenw
 2004-12-29 19:38
#3924 #3924
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Alex,29.12.2004, 16:52]Das nächste Thema sind Referenzen, die ich trotz Freaktreffen leider immer noch nicht schnalle.[/quote]
Referenzen sind nicht schwer. Stelle Dir Container vor:

Den ersten nennst Du VALUE und den 2. REF.

In den Container VALUE legst Du eine Einladung. Greifst Du also auf den Container VALUE zu, dann bekommst Du die Einladung.

Jetzt legst Du in den Container REF einen Zettel, wo drauf steht, wo Container VALUE steht. Container REF enthält also den Ablageort der Einladung.

Wenn Du also über Container REF auf die Einadung zugreifen willst, dann holst Du Dir aus Container REF den Zettel und liest, wo Container VALUE steht. Jetzt kannst Du die Einladung wiederfinden.

Klar ist Dir sicher auch, daß es mehrere Container ähnlich REF geben kann und immer liegt ein Zettel drin, wo VALUE zu finden ist. Es kann also mehrere Referenzen auf ein und den selben Werte geben.

Mehr ist das nicht mit den Referenzen. Versuche in Containern, Kisten, o.ä. zu denken, das hilft.
$SIG{USER} = sub {love 'Perl' or die};
Alex
 2004-12-29 19:55
#3925 #3925
User since
2003-12-04
285 Artikel
BenutzerIn
[default_avatar]
Lieb' von Dir,

soweit bin ich schon, was das Prinzip ist.
Renee hat sich auf dem Freaktreffen ganz viel Mühe gegeben mir das zu erklären. Ich kann auch bestimmt schon welche bilden und wieder dereferenzieren usw. Mir will nur nicht in den Kopf -> Warum? Für was? Habe es noch nie gebraucht und kann mir irgendwie nicht vorstellen für was das gut sein soll. Warum erst einen Zettel mit dem Ort der Wurst liefern wenn ich sie auch gleich haben kann! Wann setze ich es ein? Ging' bißher immer ohne...
... aber getreu meinem obigen Statement ich will dazulernen. Und Ihr quatscht hier alle ständig davon, also kann ich davon ausgehen das Referenzen gut sind, das will ich auch sein, also muss ich es lernen... ;)
<center>Schönen Gruß, Alex
Mit dem Computer geht alles viel schneller - es dauert nur ein bißchen länger!
</center>
esskar
 2004-12-29 20:09
#3926 #3926
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
das ist ne speicherbedarf und ne performance sache.
annahme, du hast ein array mit 1000 elementen. wenn du der funktion z.b. das komplette array übergeben tust (copy-by-value), muss ein zweites array anglegt werden, in das dann die 1000 elemente rein kopiert werden müssen. das kostet erstens zeit und zweitens hast du nun den speicher verbrauch verdoppelt. übergibst du jedoch eine referenz (copy-by-ref) kostet dich das nur den speicher für die referenz und die ist nicht sehr groß; und das kopieren bleibt völlig aus
Strat
 2004-12-29 21:34
#3927 #3927
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
referenzen sind halt die basis fuer komplexere datenstrukturen, z.B. mehrdimensionale arrays oder hashes oder mischungen davon. Man kann auf die notfalls auch verzichten (ok, man kann auch ein array in einem string abbilden), aber manche algorithmen werden sehr viel einfacher, wenn man sie mit daten in einer struktur fuettert, bei der sie moeglichst effizient arbeiten.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Alex
 2004-12-29 22:12
#3928 #3928
User since
2003-12-04
285 Artikel
BenutzerIn
[default_avatar]
[quote=Strat,29.12.2004, 20:34]aber manche algorithmen werden sehr viel einfacher, wenn man sie mit daten in einer struktur fuettert, bei der sie moeglichst effizient arbeiten.[/quote]
Häh?

Ich werd' mir das nochmal in einem Buch zu Gemüte führen...
<center>Schönen Gruß, Alex
Mit dem Computer geht alles viel schneller - es dauert nur ein bißchen länger!
</center>
renee
 2004-12-29 23:12
#3929 #3929
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Strat
 2004-12-29 23:46
#3930 #3930
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Alex,29.12.2004, 21:12][quote=Strat,29.12.2004, 20:34]aber manche algorithmen werden sehr viel einfacher, wenn man sie mit daten in einer struktur fuettert, bei der sie moeglichst effizient arbeiten.[/quote]
Häh?[/quote]
nimm einfach mal eine subroutine mit parameteruebergabe her; wenn du da z.B. ein @array und einen %hash reingeben willst, bekommt man da probleme:
Code (perl): (dl )
1
2
3
4
5
6
7
my @array = 1..10;
my @hash = ('x' => 20, 'y' => 30);
&Sub1(@array, %hash);
sub Sub1 {
  my (@array1, %hash1) = @_;
  print "@array";
}

Das hat das Problem, dass sowohl @array als auch %hash von @array1 geschluckt werden, und %hash1 leer bleibt. Man koennte da z.B. die laenge von @array als ersten parameter uebergeben und dann die ersten x elemente aus @_ herausfieseln und den rest dann %hash zuweisen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my @array = 1..10;
my @hash = ('x' => 20, 'y' => 30);
&Sub1($#array, @array, %hash);
sub Sub1 {
  my $lastArrayIndex = shift(@_);
  my @array1 = @_[0..$lastArrayIndex];
  my %hash1 = @_[$lastArrayIndex+1..$#];
  print "@array1";
}

das koennte funktionieren (hab's nicht ausprobiert), ist aber ziemlich umstaendilch. Durch die Verwendung von Referenzen packst du die Daten in ein skalares paektchen, und du hast keinerlei probleme mehr
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my @array = 1..10;
my @hash = ('x' => 20, 'y' => 30);
&Sub1(\@array, \%hash);
sub Sub1 {
  my ($arrayRef, $hashRef) = @_;
  my @array1 = @$arrayRef;
  my @hash1 = %$hashRef;
  print "@array";
  # oder besser direkt mit den referenzen weiterarbeiten:
  # print "@$arrayRef";
}


in diesem Fall wird die Parameteruebergabe um einiges einfacher (und, wenn du in der subroutine weiter mit den referenzen arbeitest, sparst du auch noch ram, weil die referenz auf die daten von @array bzw. %hash zeigen), und wenn du das element $arrayRef->[4]=300; setzt, wird auch $array[4] auf 300 gesetzt.

ein weiteres beispiel: ein kleines adressbuch:
Code (perl): (dl )
1
2
my %person1 = (name => 'Martin', nick => 'Strat', mail => 'a@local');
my %person2 = (name => 'Alex', nick => 'Alex', mail => 'b@local');

mit sowas kann man wunderbar arbeiten, aber wenn man alle adressen in eine subroutine uebergeben will, kann man zwar jeden einzelnen hash (als referenz) uebergeben, z.B.
Code (perl): (dl )
&Sub(\%person1, \%person2);

aber sobald eine dritte person dazukommt, musst du das komplette programm aendern. da koennte man z.B. die ganzen personen in eine weitere datenstruktur packen; ich verwende einfach mal einen hash, dessen schluessel die nick's sind und dessen wert ein komplettes personenobjekt
Code (perl): (dl )
1
2
3
4
my %addresses = (
  Alex => { name => 'Alex', nick => 'Alex', mail => 'b@local' },
  strat => {name => 'Martin', nick => 'Strat', mail => 'a@local' },
);

dann hast du das ganze schon mal in einer datenstruktur; wenn du z.B. an eine subroutine nur eine Person uebergeben willst, kannst du das z.B. mit
Code (perl): (dl )
&Subroutine( $addresses{Alex} )

einfach tun. wenn du aber in der subroutine die infos von mehreren Personen haben willst, kannst du auch die komplette %addresses uebergeben.

habe ich mal fuers erste alle Klarheiten beseitigt?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 4 5 >| >> 47 Einträge, 5 Seiten



View all threads created 2004-12-26 00:24.