Schrift
[thread]11237[/thread]

static variable (Seite 3)

Leser: 1


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
#Kein Kommentar
 2008-02-16 12:50
#105964 #105964
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
betterworld+2008-02-16 01:10:49--
(Allerdings weiss ich auch nicht, wie Du jetzt auf "strict" kommst.)


"strict" sucht ja nach undeklarierten variablen im quelltext, um dann eine fehlermeldung auszugeben... theoretisch ist aber in deinem code $f ja deklariert, nur praktisch nicht, weil es eigentlich niemals deklariert wird (die if-bedingung wird ja nie erfüllt)

wenn du nämlich so schreiben würdest:
Code: (dl )
1
2
3
4
5
6
7
8
9
use strict;

sub foo {
#my $f if 0;
print ++$f, "\n";
}

foo(); # 1
foo(); # 2


würde ein fehler wegen strict kommen....
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
pq
 2008-02-16 13:16
#105970 #105970
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
betterworld+2008-02-15 20:12:36--
Laut dem Artikel geht es allerdings in 5.10 nicht mehr. Ist ja gemein, das haetten sie eigentlich nur dokumentieren muessen, dann haetten sie kein neues Keyword fuer state gebraucht.

es funktioniert eh nur in bestimmten fällen. mach mal statt dem ++ irgendeine zuweisung.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2008-02-16 16:05
#105979 #105979
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
pq+2008-02-16 12:16:00--
betterworld+2008-02-15 20:12:36--
Laut dem Artikel geht es allerdings in 5.10 nicht mehr. Ist ja gemein, das haetten sie eigentlich nur dokumentieren muessen, dann haetten sie kein neues Keyword fuer state gebraucht.

es funktioniert eh nur in bestimmten fällen. mach mal statt dem ++ irgendeine zuweisung.

Koenntest Du mir ein explizites Beispiel zeigen? Ich habe es gerade mit Zuweisungen probiert und nicht geschafft, es am funktionieren zu hindern.
KurtZ
 2008-02-16 16:14
#105980 #105980
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-02-16 04:21:56--
KurtZ, jetzt hast Du aber wieder die zusätzlichen Curlies drin. Die braucht man aber gerade nicht, wenn man our statt my verwendet.


Es ging mir darum Closures mit Packetvariablen zu simulieren und dann braucht man die Curlies. Natürlich kann man die Variablen direkt adressieren
Code (perl): (dl )
$raum::name

aber mit our erspare ich mir das und kann bequem in einer Zeile mehrere Variabln aus verschiedenen Namensräumen mischen (was bei deinem Beispiel mit package nicht geht).


betterworld+2008-02-16 04:21:56--
Naja, use vars gilt fuer den Rest des Paketes, our fuer den Rest des Blocks. Aber wie Du schon sagst, das ist alles eh nur dann relevant, wenn man strict verwendet.


Mein Beispiel funktioniert auch ohne strict genau so, und ohne our überhaupt nicht.

Wenn Perl auf eine Variable trifft sucht er nach der letzten vorhergehenden Deklaration im Scope um den Speicherraum der Variablen zu bestimmen. "Strict" ändert die "Defaultdeklaration" in eine Fehlermeldung, sodass ich nicht versehentlich eine
undeklarierte Variable benutze.

War die gefundene our-Deklaration in einem anderen Namensraum, dann auch die Variable!
Ich finde das eine geniale Neuerung, weil das viel Schreibarbeit spart und das Scoping von "our" analog zu "my" ist.

Zum Scoping habe ich etliche Experimente gemacht und Selfhtml-forum dokumentiert, leider kann ich das enstprechende Posting im Archiv nicht mehr finden... :-(

EDIT: Ah jetzt ja -> Scoping und Variablenräume



Konkret OO-technisch gesprochen Closures sind eine schnelle und billige Art Klassenmethoden/variablen zu realisieren, wenn man keine Objekte und Instanzvariable braucht.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  #--- Deklaration der "Klassenvariablen"
  #- lexikalisch
  my ($lexical1,...);
  #- symboltabelle
  package Variablenraum;
     our ($pack1,...);

  #--- Deklaration der "Klassenmethoden"
  package Methodenraum; #normalerweise "main"
    sub Klassenmethode1 {}
    sub Klassenmethode2 {}
    ...
}


Natürlich sollte man im Zweifelsfall immer lexikalische bevorzugen.
Der entscheidende Unterschied ist dabei die Kapselung, die Packagevariablen kann ich immernoch außerhalb des Blocks adressieren und manipulieren!!!
TMTOWTDYOG (there's more than one way to dig your own grave)
pq
 2008-02-17 02:02
#105992 #105992
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
betterworld+2008-02-16 15:05:15--
Koenntest Du mir ein explizites Beispiel zeigen? Ich habe es gerade mit Zuweisungen probiert und nicht geschafft, es am funktionieren zu hindern.

kriegs nicht mehr zusammen, ich glaub, mit 'if 0' sollte das doch immer gehn, ich hatte mich
an anderen code erinnert.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



View all threads created 2008-02-03 18:46.