Referenz auf Skalar
am 21.03.2006 20:35:09 von Torsten Mohr
Hallo,
in dem kurzen Skript unten wird einmal 7 ausgegeben
und einmal 9. Warum macht das "my" da so einen
Unterschied? Ich hab erwartet daà sich beide
Teile gleich verhalten.
Es wäre prima wenn mir da jemand einen Tip geben
könnte.
GrüÃe,
Torsten.
#! /usr/bin/perl -w
my $a = 7;
my $b = 'a';
$$b = 9;
print "a $a\n"; # 7
$c = 7;
$d = 'c';
$$d = 9;
print "c $c\n"; # 9
Re: Referenz auf Skalar
am 21.03.2006 20:57:23 von Frank Seitz
Torsten Mohr wrote:
> in dem kurzen Skript unten wird einmal 7 ausgegeben
> und einmal 9. Warum macht das "my" da so einen
> Unterschied? Ich hab erwartet daà sich beide
> Teile gleich verhalten.
Willst Du wirklich mit Symbolic References programmieren?
Lass es lieber, wenn es nicht unbedingt sein muss,
und schütze Dein Programm lieber mittels "use strict" dagegen,
dass Dir das versehentlich passiert.
> #! /usr/bin/perl -w
>
> my $a = 7;
> my $b = 'a';
>
> $$b = 9;
Hier manipulierst Du die (bislang nicht existente)
globale Variable $a.
> print "a $a\n"; # 7
>
> $c = 7;
> $d = 'c';
> $$d = 9;
Hier manipulierst Du die (bereits existente)
globale Variable $c.
> print "c $c\n"; # 9
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Referenz auf Skalar
am 21.03.2006 21:47:46 von Torsten Mohr
Hallo,
> Willst Du wirklich mit Symbolic References programmieren?
> Lass es lieber, wenn es nicht unbedingt sein muss,
> und schütze Dein Programm lieber mittels "use strict" dagegen,
> dass Dir das versehentlich passiert.
danke für den Tip. Ich möchte die auch nicht wirklich verwenden,
ich wollte allerdings das Problem verstehen, da ich das Verhalten
ja anders erwartet hatte.
Deine Erklärung hilft mir in meinem Verständnis da weiter. Es ist
jetzt recht logisch, mit "my" ist $a lokal. Zwar auf Dateiebene,
aber eben doch nicht mehr das globale $a das es vorher gar nicht
gab.
Danke,
Torsten.
Re: Referenz auf Skalar
am 23.03.2006 14:44:52 von Ferry Bolhar
Thorsten Mohr:
> in dem kurzen Skript unten wird einmal 7 ausgegeben
> und einmal 9. Warum macht das "my" da so einen
> Unterschied? Ich hab erwartet daß sich beide
> Teile gleich verhalten.
>
> Es wäre prima wenn mir da jemand einen Tip geben
> könnte.
Aber ja: schreib in dein Skript
print "$::a\n";
und du wirst die erwartete 9 ausgegeben bekommen.
Was du hier verwendest, sind sog. symbolische Referenzen (brr, sollte man
nicht tun!), und die funktionieren nur mit globalen (dh., nicht
lexikalischen) Variablen, die einen Eintrag in einer Symboltabelle (package)
haben.
Das "my $a" deklariert ein lexikalische Variable. Wenn du später $$b als
symbolische Referenz für $a schreibst, sprichst du ein noch nicht
vorhandenes $a (nämlich das $a im package "main", dh. "$main::a" oder kürzer
"$::a") an und weist ihm den Wert 9 zu. Das lexikalische $a bleibt davon
völlig unbeeindruckt, weil man lexikalische Variable eben so nicht
ansprechen kann (auch nicht mit typeglobs, bei einem "my *a;" würde sich der
Compiler lauthals beschweren). Da aber bei einer Angabe wie "$a" immer
zuerst lexikalische Variable angesprochen werden (soferne sie existieren),
musst du in diesem Fall, um eine globale Variable anzusprechen, deren Namen
voll ausqualifizieren, dh., mit ihrem package Namen (das ist - ohne
vorherige "package"-Anweisung - immer "main"), ansprechen, wie ich es weiter
oben gezeigt habe. Das "main" kann man auch weglassen, nicht aber die beiden
Doppelpunkte, die als Namensraumtrenner fungieren.
Im zweiten Teil funktioniert's wie erwartet, weil du da keine lexikalischen
Variablen verwendest.
Schöne Grüße,
Ferry
--
Ing. Ferry Bolhar
Municipality of Vienna, Department 14
A-1010 Vienna / AUSTRIA
E-mail: bol@adv.magwien.gv.at
Re: Referenz auf Skalar
am 24.03.2006 21:49:15 von Christian Garbs
Mahlzeit!
Frank Seitz wrote:
> Hier manipulierst Du die (bislang nicht existente)
> globale Variable $a.
Existieren die globalen Variablen $a und $b nicht immer?
Oder werden die erst erzeugt, wenn ich sort() aufrufe?
GruÃ,
Christian
--
sub _{print"\n"}_;for(;$s<9;++$s){$_='1E2018201E00001E2018201E00001E2018201'
..'E002020001C2222221400005CA2A2A27C02001C2222221C20003E0402 02201F2422221C00'
..'242A2A2A12002020001C2222221F20001C2A2A2A0C';while(s;(..); ;){printf'%c',hex
$1&1<<$s?40:32}_}$_=':::Christian Garbs:',y;:;\t;;print;_;_
Re: Referenz auf Skalar
am 24.03.2006 23:16:38 von Frank Seitz
Christian Garbs wrote:
> Frank Seitz wrote:
>>
>>Hier manipulierst Du die (bislang nicht existente)
>>globale Variable $a.
>
> Existieren die globalen Variablen $a und $b nicht immer?
> Oder werden die erst erzeugt, wenn ich sort() aufrufe?
An die beiden Standardvariablen hatte ich natürlich nicht gedacht.
Da Du aber fragst: Nein, die existieren erstmal nicht,
erst, wenn man sort() mit selbstdefiniertem Sortierkriterium
aufruft.
$ perl -e 'print "$_\n" for (sort keys %main::)'
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Referenz auf Skalar
am 25.03.2006 12:22:23 von hjp-usenet2
Frank Seitz wrote:
> Christian Garbs wrote:
>> Frank Seitz wrote:
>>>Hier manipulierst Du die (bislang nicht existente)
>>>globale Variable $a.
>>
>> Existieren die globalen Variablen $a und $b nicht immer?
>> Oder werden die erst erzeugt, wenn ich sort() aufrufe?
>
> An die beiden Standardvariablen hatte ich natürlich nicht gedacht.
> Da Du aber fragst: Nein, die existieren erstmal nicht,
Jein. Sie existieren nicht in jedem perl-Programm. In Thorstens Programm
existiert sie aber zum Zeitpunkt der Zuweisung bereits.
> erst, wenn man sort() mit selbstdefiniertem Sortierkriterium
> aufruft.
Nein, vom Aufruf von sort ist das gänzlich unabhängig. Es kommt darauf
an, ob die Variable verwendet wird. Wenn das der Fall ist, wird sie vom
Compiler angelegt.
> $ perl -e 'print "$_\n" for (sort keys %main::)'
#!/usr/bin/perl -w
use strict;
use warnings;
print "$_\n" for (sort keys %main::);
if (0) {
$a = 5;
}
--
_ | Peter J. Holzer | Löschung von at.usenet.schmankerl?
|_|_) | Sysadmin WSR/LUGA |
| | | hjp@hjp.at | Diskussion derzeit in at.usenet.gruppen
__/ | http://www.hjp.at/ |
Re: Referenz auf Skalar
am 25.03.2006 13:28:44 von Frank Seitz
Peter J. Holzer wrote:
> Frank Seitz wrote:
>>Christian Garbs wrote:
>>>Frank Seitz wrote:
>>>
>>>>Hier manipulierst Du die (bislang nicht existente)
>>>>globale Variable $a.
>>>
>>>Existieren die globalen Variablen $a und $b nicht immer?
>>>Oder werden die erst erzeugt, wenn ich sort() aufrufe?
>>
>>An die beiden Standardvariablen hatte ich natürlich nicht gedacht.
>>Da Du aber fragst: Nein, die existieren erstmal nicht,
>
> Jein. Sie existieren nicht in jedem perl-Programm. In Thorstens Programm
> existiert sie aber zum Zeitpunkt der Zuweisung bereits.
Du hast recht, globale Variable werden bereits zur Compile-Zeit
angelegt und in die betreffende Symboltabelle eingetragen,
existieren also bereits vor Ausführung der ersten Codezeile.
Das ist auch vernünftig, war mir - meine Sprechweise
zeigt es - allerdings nicht bewusst. Danke für die Klarstellung.
>>erst, wenn man sort() mit selbstdefiniertem Sortierkriterium
>>aufruft.
>
> Nein, vom Aufruf von sort ist das gänzlich unabhängig. Es kommt darauf
> an, ob die Variable verwendet wird. Wenn das der Fall ist, wird sie vom
> Compiler angelegt.
Ein sort() mit selbstdefiniertem Sortierkriterium impliziert
die Verwendung der angesprochenen $a und $b (normalerweise).
Insofern existieren sie dann auch und werden von Perl verwendet.
Darum ging es. Dass sie zur Compile-Zeit und nicht zum Zeitpunkt
des Aufrufs angelegt werden, ist bei dieser Frage
eher nebensächlich.
GrüÃe
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel