Schrift
[thread]11232[/thread]

"Always use my; never use local" ?



<< >> 9 Einträge, 1 Seite
RalphFFM
 2008-02-01 11:30
#105440 #105440
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
http://perl.plover.com/FAQs/Namespaces.html#When_t...

Kann man das wirklich so empfehlen? (s.Betreffzeile)
Ich sehe sooooo häufig die Verwendung von local.

Was meint Ihr?
Taulmarill
 2008-02-01 11:42
#105442 #105442
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Sagen wir mal, man sollte local nur dann benutzen, wenn man genau weiß, warum man jetzt gerade my nicht benutzen soll/kann. Der einzige Fall, der mir jetzt spontan für local einfällt ist:
Code (perl): (dl )
1
2
3
4
{
    local $/ = undef;
    $einfach_alles = <FILE>;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
murphy
 2008-02-01 11:57
#105443 #105443
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte sich einfach bewusst sein, dass local nicht für lokale Variablen gedacht ist – dafür gibt es eben my – sondern für das lokale und temporäre Verändern des Wertes einer globalen Variablen.

Neben dem Beispiel von Taulmarill ist meines Erachtens auch noch bei folgendem Konstrukt der Einsatz von local kritisch wichtig:
Code (perl): (dl )
1
2
3
4
5
6
{
  local $_;
  while (<FILE>) {
    # do something
  }
}

(Wenn man hier kein local verwendet und sich innerhalb einer Subroutine befindet zerschießt man dem aufrufenden Code den Inhalt von $_, was ungewünschte Konsequenzen haben kann.)

In Perl 5.10 sieht die Situation nochmal etwas anders aus, da hier im Spezialfall $_ nahezu identisches Verhalten aus den Deklarationen local $_ und my $_ resultiert.
When C++ is your hammer, every problem looks like your thumb.
lichtkind
 2008-02-01 12:47
#105455 #105455
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
local bringt weniger ungewollte weiteneffekte als my und deswegen benutz ich nur local wenn ich unbedingt muss.

vergiss bitte nicht das local der erste versuch war in perl sowas wie lokale variablen zu hacken und es mit einem verhalten simuliert wurde das in meisten fällen geht aber in meisten fällen nicht das ist was du erwartest.
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
renee
 2008-02-01 13:16
#105459 #105459
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Man muss bei local auch immer aufpassen mit der Sichtbarkeit von Veränderungen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl

$test = 5;
print "start test: $test\n";

{
   my $test = 3;
   print "my test: $test\n";
   print_test();
}

{
   local $test = 8;
   print "local test: $test\n";
   print_test();
}

sub print_test{
   print "print_test: $test\n";
}


Ausgabe:
Code: (dl )
1
2
3
4
5
start test: 5
my test: 3
print_test: 5
local test: 8
print_test: 8


Ich verwende local nur bei dem von Taulmarill genannten Fall. Bei while-Schleifen verzichte ich auf $_ und verwende eine lexikalische Variable.
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/
pq
 2008-02-01 14:27
#105468 #105468
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
RalphFFM+2008-02-01 10:30:34--
Kann man das wirklich so empfehlen? (s.Betreffzeile)

ja
Quote
Ich sehe sooooo häufig die Verwendung von local.

dann ist es alter code (my gibt es seit perl 5.4) und/oder schlechter code.
das einzige, wofür du local brauchst, sind vordefinierte variablen wie $/, $_ und die
standard-filehandles. in seltenen fällen auch für eigene variablen.
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-01 18:40
#105474 #105474
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Man braucht local eigentlich höchstens dann, wenn my eh einen Fehler ausgeben würde. Also hat man so gut wie nie die Wahl.

Naja, ok, 5.10... wie isn das, braucht man local da jetzt ueberhaupt noch, wenn man auch my auf Spezialvariablen anwenden kann?
ptk
 2008-02-01 22:54
#105476 #105476
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Taulmarill+2008-02-01 10:42:26--
Sagen wir mal, man sollte local nur dann benutzen, wenn man genau weiß, warum man jetzt gerade my nicht benutzen soll/kann. Der einzige Fall, der mir jetzt spontan für local einfällt ist:
Code (perl): (dl )
1
2
3
4
{
    local $/ = undef;
    $einfach_alles = <FILE>;
}

Oder (falls man aus irgendwelchen Gründen die OO-Notation von Data::Dumper nicht verwenden möchte):
Code: (dl )
1
2
3
4
{
local $Data::Dumper::Sortkeys = 1;
Dumper ...
}

Eigentlich generell überall, wo Modulverhalten über globale Variablen gesetzt wird. Das ist insbesondere bei alten CPAN-Modulen oft der Fall.
murphy
 2008-02-02 03:18
#105478 #105478
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
betterworld+2008-02-01 17:40:05--
[...]
Naja, ok, 5.10... wie isn das, braucht man local da jetzt ueberhaupt noch, wenn man auch my auf Spezialvariablen anwenden kann?


Man braucht schon deswegen weiterhin local, weil $_ die einzige Spezialvariable ist, die sich bei Perl 5.10 besonders verhält, wenn man eine lexikalische Version von ihr mit my deklariert.

Geändert hat sich hier effektiv auch nicht das Verhalten des Perlkerns sondern des Perlcompilers, welcher an den Stellen, wo er schon immer automatisch einen Zugriff auf $_ in den Parsetree einfügt, nun zuerst den lokalen lexikalischen Namensraum nach einem $_ durchsucht und erst falls es ein solches nicht gibt das globale $_ benutzt.

Im Übrigen hat diese Änderung des Compilers auch den netten Spinoff, dass es jetzt einen Subroutinenprototypen _ gibt, welcher $ entspricht, wobei der Parameter aber implizit mit $_ belegt wird, wenn er nicht explizit angegeben wird.

Das Verhalten von my $_ und local $_ ist aber natürlich auch unter Perl 5.10 noch subtil verschieden – nur für die klassischen Anwendungsfälle macht es keinen Unterschied mehr. Nur mal als Beispiel:
Code: (dl )
1
2
3
% perl -Mstrict -Mwarnings -E 'sub g { say }; sub f0 { local $_ = 42; g }; sub f1 { my $_ = 23; g }; f0; f1'
42
Use of uninitialized value $_ in say at -e line 1.
When C++ is your hammer, every problem looks like your thumb.
<< >> 9 Einträge, 1 Seite



View all threads created 2008-02-01 11:30.