Schrift
[thread]11237[/thread]

static variable (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten
Strat
 2008-02-04 14:11
#105546 #105546
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
betterworld+2008-02-03 21:04:35--
Das nutzt ein "Feature" aus, was die meiste Zeit eigentlich nur stoerend auffaellt, und zwar, dass my-Variablen in inneren Funktionen zu so einer Art State-Variablen werden.

Sowas ist eine Sonderform von Closures...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
murphy
 2008-02-04 16:00
#105549 #105549
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
betterworld+2008-02-03 21:04:35--
[...]
Das nutzt ein "Feature" aus, was die meiste Zeit eigentlich nur stoerend auffaellt, und zwar, dass my-Variablen in inneren Funktionen zu so einer Art State-Variablen werden.


In Anbetracht der Tatsache, dass my genau jedesmal wenn es zur Laufzeit angetroffen wird eine neue "Instanz" der lexikalischen Variablen erzeugt, ist das doch das einzig logische Verhalten.

Wo dieses Feature störend sein sollte, kann ich mir eigentlich nicht vorstellen -- wüsstest Du da ein Beispiel?

edit: Hmm, in Kombination mit dem flachen Namensraum für Subroutinen verhält sich Perl natürlich etwas merkwürdig, wenn man so etwas tut:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use 5.010;
use strict;
use warnings;

sub outer() {
  my $state = 'outer called';
  sub inner() {
    say 'my state is: ', $state // 'uninitialized';
    $state = 'inner called'
  }
}

inner();
inner();

outer();
inner();
inner();


Allerdings erzeugt dieser Code auch eine aussagekräftige Warnung.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-02-05 03:40
#105564 #105564
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
murphy+2008-02-04 15:00:13--
Wo dieses Feature störend sein sollte, kann ich mir eigentlich nicht vorstellen -- wüsstest Du da ein Beispiel?

http://perl.apache.org/docs/general/perl_reference...
http://perl.apache.org/docs/1.0/guide/frequent.htm...
murphy
 2008-02-05 04:55
#105566 #105566
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@betterworld: Dass es mit benannten Subroutinen Probleme aufgrund des flachen Namensraumes geben kann, habe ich ja selbst schon geschrieben. Aber erstens produziert solcher Code eine Warnung, und zweitens hat das Problem doch eigentlich wenig mit dem Verhalten von my zu tun, sondern damit, dass der Gültigkeitsbereich von Subroutinen unsinnig groß ist, bzw. dass ein Konstrukt wie my sub foo { ... } in der Sprache fehlt. Im Übrigen deutet die Fehlermeldung bei der Verwendung dieses Konstruktes ("my sub" not yet implemented [...]) darauf hin, dass der Designfehler vielleicht noch behoben wird.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2008-02-15 21:12
#105944 #105944
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
In dem kuerzlich woanders von moritz velinkten Artikel (http://www.perlmonks.org/?node_id=654086) habe ich noch eine geile Schreibweise fuer state-Variablen gefunden:
Code: (dl )
1
2
3
4
5
6
sub foo {
my $f if 0;
print ++$f, "\n";
}
foo(); # 1
foo(); # 2


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.
#Kein Kommentar
 2008-02-15 23:35
#105949 #105949
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
das ist ja mal eine geile schreibweise!!! :]

wird mit dem my $f if 0; use strict; kaltgestellt?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
betterworld
 2008-02-16 02:10
#105955 #105955
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
#Kein Kommentar+2008-02-15 22:35:55--
wird mit dem my $f if 0; use strict; kaltgestellt?

Hmm, wenn ich so drueber nachdenke, weiss ich eigentlich wirklich nicht, was es genau tut. Es scheint einiges zu tun, was my normalerweise tut (eine Variable erzeugen), anderes von dem wird aber durch das "if 0" vermieden (die Variable zu lokalisieren). Laut perlsyn ist das Ergebnis nicht definiert. (Such nach "Here be dragons".)
(Allerdings weiss ich auch nicht, wie Du jetzt auf "strict" kommst.)

Treiben wir es noch mal etwas weiter:
Code: (dl )
1
2
3
4
5
6
7
8
9
sub foo {
my $f = 40 if @_;
print ++$f, "\n";
}
foo(); # 1
foo(); # 2
foo(1); # 41
foo(); # 1
foo(); # 2

Schon etwas eigenartig. (Muss unbedingt in meinen naechsten Produktivcode.)
KurtZ
 2008-02-16 04:52
#105956 #105956
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
betterworld+2008-02-03 20:58:26--
Also mit our() wuerde das (ab 5.6 oder so) auch gehen. Der Nachteil waere dann nur, dass man nicht in zwei verschiedenen Funktionen im selben Paket eine Variable vom gleichen Namen nehmen darf.


Our deklariert doch nichts anderes als eine globale Packagevariable, das ist Jacke wie Hose, da kanst du auch gleich "use vars" schreiben.

Das Scoping von Our regelt nur, wo die Variable benutzt werden darf (d.h. strict meckert nicht) und in welchem Namensraum sie abgespeichert wird.

Mit 'package' kriegt man nämlich auch mit globalen Variablen sowas wie Closures
(für Arme) hin!


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use strict;
use warnings;


{
    package eins;
    our $i;
    package main;
    sub inc1{
        print ++$i,"\n";
    }
}



{
    package zwo;
    our $i=10;
    package main;
    sub inc2{
        print ++$i,"\n";
    }
}

inc1();
inc2();
inc1();
inc2();


Man hätte natürlich auch gleich sowas schreiben können:
Code (perl): (dl )
print ++$eins::i,"\n"

aber obige Lösung lässt sich einfacher erweitern
TMTOWTDYOG (there's more than one way to dig your own grave)
betterworld
 2008-02-16 05:21
#105957 #105957
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
KurtZ, jetzt hast Du aber wieder die zusätzlichen Curlies drin. Die braucht man aber gerade nicht, wenn man our statt my verwendet.
Code (perl): (dl )
1
2
3
4
sub incl {
    # package eins; # hin oder her
    print ++our($i), "\n";
}


Quote
Our deklariert doch nichts anderes als eine globale Packagevariable, das ist Jacke wie Hose, da kanst du auch gleich "use vars" schreiben.

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.
renee
 2008-02-16 11:08
#105958 #105958
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
KurtZ+2008-02-16 03:52:28--
betterworld+2008-02-03 20:58:26--
Also mit our() wuerde das (ab 5.6 oder so) auch gehen. Der Nachteil waere dann nur, dass man nicht in zwei verschiedenen Funktionen im selben Paket eine Variable vom gleichen Namen nehmen darf.


Our deklariert doch nichts anderes als eine globale Packagevariable, das ist Jacke wie Hose, da kanst du auch gleich "use vars" schreiben.


Dazu siehe auch http://use.perl.org/article.pl?sid=08/02/14/195423...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 25 Einträge, 3 Seiten



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