Beat: $_[0] problem

Beitrag lesen

Das ist ja alles richtig, aber ich muss gesetehn, ich weiß auf die eigentliche Frage auch keine Antwort und habe sei hier auch noch nicht gelesen.

Warum ist der Zugriff auf $_[0] ein Zugriff auf die Referenz?
Meine Vorstellung ist, dass es das erste Element von @_ ist und in dem Array @_ ist eine Kopie der Parameter. Mit dieser Erklärung ergibt das keinen Sinn:

use strict;

my $a = 'Hallo';

print $a;
umwandeln($a);
print $a;

sub umwandeln {
$_[0] = 'bye';
}


>   
> Also, wer weiß die Antwort?  
  
Ich habe auch keine Standard-Antwort.  
Ich frage mich, ob @\_ eine Liste von echten Referenzen darstellt, oder ob man den Mechanismus als Alias, also als Sonderfall interner Referenzen auffassen soll.  
Das Verhalten ist:  
  
   myfunc($x,$y,$z)  
  
bewirkt, dass @\_ eine Liste von Aliasen ist zu den Werten $x, $y, $z.  
Durch manipulieren dieser Aliase manipuliere ich (analog zu $\_ in einer Schleife), den Wert direkt. Es handelt sich um einen Alias, also nicht um eine Kopie oder eine Referenz.  
Aber:  
  
   myfunc('constant');  
  
ergibt einen Error, wenn man versucht, $\_[0] zu modifizieren. Das bedeutet nicht dass ich die Elemente in @\_ nicht modifizieren darf, sondern dass die modifizierten Elemente immer auf eine Variable zeigen müssen, statt auf eine Konstante (Ja hier handelt es sich um Referenzen interner Art).  
@\_ und $\_ (der Schleifen-Alias) verhalten sich diesbezüglich gleich.  
  
Ich versuche es so zu unterscheiden:  
Ein Alias ist eine implizite Referenz, das heisst es wird keine De/Referenzierung explizit verlangt. De/Referenzierung erfolgt bei jeder Art der Zuweisung oder Verarbeitung.  
Aliase können nur dann manipuliert werden, wenn sie auf echte Variablen verweisen (hierin besteht ihre Natur als Referenz).  
  
Beispiel:  
    $some\_var =~ /(.)/ and myfunc($1);  
Manipulation von $\_[0] wäre eine irrtümliche Manipulation von $1.  
  
Nun zur Frage des OP, warum geht folgendes nicht:  
   sub myfunc{  
     my $temp = shift; # das ist kurz für: shift @\_  
   }  
shift @array entfernt das erste Element und kopiert den Wert in die neue Variable. That's it. Jeder Bezug geht verloren, sofern der Wert nicht eine Referenz war.  
  
mfg Beat

-- 
Woran ich arbeite:  
[link:http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1@title=X-  
   <°)))o><                     ><o(((°>o