[vienna.pm] foreach (my, local)

Roland Bauer roland.bauer at fff.at
Tue Jul 11 16:47:45 CDT 2000


* * * vienna-pm-list * * *


> Ich hab den Unterschied zwischen 'local' und 'my' zwar glaube ich schon
> verstanden ('local' sichert den Wert einer alten Variable und verwendet
> die gleiche Variable (d.h. die gleiche Adresse) weiter, waehrend 'my' eine
> neue Variable (i.e. eine neue Adresse) anlegt, und die fuer die Dauer des
> Blocks an den alten Namen bindet), aber ich bin mir ueber die praktische
> Relevanz nicht ganz im klaren.

Mit "local" lokalisierte Variablen werden an aufgerufene Unterprogramme
weitergereicht: sog. dynamisches Scoping.

Das"my" wirkt nur im Block und in eingeschlossenen Bloecken von
Programmcode, aber nicht in aufgerufenen Unterprogrammen: sog.
lexical scoping.

Das "local" kann auch Auswirkungen auf den Code in
einem anderen File haben. Das "my" nicht. Das "my" wirkt nur
auf den Code den Du vor Dir siehst und nicht auf den Code
in aufgerufenen Unterprogrammen (die koennten sich auch in anderen
Files befinden).

use strict gibt sich mit local nicht zufrieden. Du musst "my"
verwenden. Ausser bei den gloablen system-variablen ($_, ...). Da ist
es genau umgekehrt: Da muss man local verwenden und
darf nicht my verwenden.

ohne use strict hat man bei "normalen" variablen (nicht systemvariablen)
die wahl zwischen my und local. in 99 % der faelle ist my
das passende.


> Insbesondere: Offenbar sind
> System-Variablen wie $_ oder @ARGV an fixe Adressen gebunden, d.h. fuer
> die musz man local verwenden, wenn man sie temporaer ueberschreiben
> moechte, wie z.B. in:

ob sie an fixe adressen gebunden sind, weiss ich nicht.
aber die schlussfolgerung ist ok.

> $string = "irgendwas";

warum nicht "my"? (use strict fehlt)

> {
>   local $_ = $string;
>   s/irgend/so/;
>   # .... (noch mehr s///, sodasz sich die Einsparung
>   #       der vieln '$string =~' wirklich auszahlt)
>   $string = $_;
> }

stimmt.

> So wirklich interessant interessant wird es aber erst hier:
>
> $string = "irgendwas"
> foreach ($string)
> {
>   s/irgend/so/;
> }
>
> Hier braucht man die letzte Zeile ($string = $_) *nicht*.
>
> Frage 1: Was passiert da?

oder:
for my $x (@string) {   #   <<<<<< @string gemeint ?
    $x =~ s/i/s/;
}

$x ist keine kopie vom aktuellen element von @string,
sondern nur eine art pointer. das aktuelle element
von @string wird als veraendert.

im fall von for ($string) {...}
ist das wie eine liste mit einem element ($string).
du veraenderst $_ und damit - analog - den wert $string.
ist dokumentiert.
vermutlich bei
perldoc perlsyn


> Frage 2: Fuer System-Variablen braucht man also local (my $_ = ...; darf
> man nicht).

stimmt genau.

> Gibt es sonst noch Faelle, wo man local braucht?

ja, wenn man den (lokalisierten) wert an aufgerufene unterprogramme
weiterreichen will. aber das das dann nicht mehr "strict" ist,
deutet schon darufhin, dass es eher nicht der normalfall ist.


> Wenn nein,
> koennte man dann nicht einfach 'my' und 'local' zu einem vereinigen,
> welches my fuer user-definierte Variablen nimmt und local fuer
> System-Variablen?

hineis: das my wurde erst mit perl5 eingefuehrt. vorher gab
es NUR local (und kein use strict). jetzt wird manches klarer ;-)


> PS (Frage 3):
> Interessanterweise steht dann aber auf p.185/185 im Kamel ein Beispiel,
> bei der eine Variable $i in einer sub, die nur fuer die Schleife verwendet
> wird, innerhalb der sub als local definiert wird. Also:
>
> sub xy {
>   local $i;
>   for $i (..) {...}
> }
>
> Das macht ja nun gar keinen Sinn, weil die Variable innerhalb des
> for-loops auf jeden Fall over-shadowed wird (sei es nun mit 'my' oder mit
> 'local'). Oder?

verstehe ich auch nicht.

Roland


###
You are subscribed to vienna-pm-list as Roland Bauer <roland.bauer at fff.at>
http://www.fff.at/fff/vienna.pm/



More information about the Vienna-pm mailing list