[vienna.pm] foreach (my, local)

Johannes Fuernkranz juffi at ai.univie.ac.at
Tue Jul 11 11:21:29 CDT 2000


* * * vienna-pm-list * * *


Toni Andjelkovic wrote:
> 
> * * * vienna-pm-list * * *
> 
> Peter J . Holzer wrote on Tue, Jul 11 2000 (16:50:49 +0200):
> > Spannend. $i hat nach der Schleife den gleichen Wert wie vorher.
> > Offensichtlich ist
> >     for $i (...)
> > völlig äquivalent zu
> >     for my $i (...)
> 
> ja, steht im kamel auf seite 100.
> 
> beides ist auch völlig äquivalent zu
> 
>     foreach VAR (LIST)

Hmm. Wenn ich Seite 100 richtig lese, heiszt das, dasz 

for $i (...)

aequivalent waere zu irgendwas wie

for local $i (...)

allerdings ist letzteres interessanterweise syntaktisch nicht korrekt.

Was mich zu zwei Fragen bringt: 
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. 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:

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

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?

Frage 2: Fuer System-Variablen braucht man also local (my $_ = ...; darf
man nicht). Gibt es sonst noch Faelle, wo man local braucht? 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?

							Juffi

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?
###
You are subscribed to vienna-pm-list as Johannes Fuernkranz <juffi at ai.univie.ac.at>
http://www.fff.at/fff/vienna.pm/



More information about the Vienna-pm mailing list