Perl vraagje
8 april 2004 - 17:23   
geplaatst door: Bram Beernink
Ik heb de volgende code:


#!/usr/bin/perl

my $j = "j";
&printj;

sub printj {
print "$j";
}

Met als uitvoer: j
Als ik dit echter verander in:


#!/usr/bin/perl

sub printj {
print "$j";
}

my $j = "j";
&printj;

Krijg ik niets als uitvoer. Hoe kan dat? Als ik trouwens my weg laat, heb ik wel altijd als uitvoer j.
Ik zou de reden graag even willen weten, zodat ik geen hoofdbrekers krijg.
Alvast bedankt!

Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
8 april 2004 - 19:44    reactie #1
geplaatst door: Sander Cox
Doordat je "my" gebruikt wordt het een LOKALE variable en is deze dus niet in de functie scope te zien. En omdat je de variable NA de procedure declareerd is deze niet meer bekend.
Moet toegeven dat het een beetje vreemd is.

[edit] had eerst niet goed gelezen ;) [/edit]

(Bewerkt door Sander Cox om 19:45, 8-04-2004)

Perl vraagje
8 april 2004 - 20:22    reactie #2
geplaatst door: Bram Beernink
Maar wat ik vreemd vind, is dat een subroutine wordt uitgevoerd op het moment van aanroep, dus &printj; , en niet op het stuk waar sub printj staat. En aangezien er tussen die twee codes geen verschil zit tussen het moment van aanropen en het declaren, zou dat toch niet moeten uitmaken (in de uitvoer)? Dat is tenminste mijn redenering. Dat verschil snap ik nog niet echt.
Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
8 april 2004 - 23:19    reactie #3
geplaatst door: habay
probeer eens:

#!/usr/bin/perl

sub printstuff {
   local($string) = @_;
   print $string;
}

$j = "j";
&printstuff($j."\n");

Perl vraagje
9 april 2004 - 10:05    reactie #4
geplaatst door: Bram Beernink
Bedankt voor de reactie's. Maar toch snap ik nog steeds het verschil in uitvoer tussen die twee codes niet. Kan iemand dat voor mij uitleggen?
Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
9 april 2004 - 16:49    reactie #5
geplaatst door: Sander Cox
Ik snap het verschil, maar ik weet niet of je iets van semantiek/correctheid hebt geleerd ooit? Want dan zou ik met wat kreten kunnen gaan gooien :) Anders krijg ik het niet zo snel uitgelegd
Perl vraagje
9 april 2004 - 20:57    reactie #6
geplaatst door: Bram Beernink
Gooi maar :wink:
Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
10 april 2004 - 11:17    reactie #7
geplaatst door: Sander Cox
Als de Perl compiler het eerste script gaat parsen gebeurt het volgende:

{
  declare binnen huidige scope variable J
  geef j een waarde
  declareer procedure printj (in dezelfde scope als var. j)
  roep de procedure aan
}
nu is de J variable dus degene die is gedeclareerd via "my j"

Code 2 is het echter:
{
  declareer procedure printj (deze heeft GEEN kennis van de later te declareren "my $j" (want dat is hij nog niet tegen gekomen
  declareer var. j in de huidige scope, dit is dus NIET de scope die de functie gebruikt.
  geef var j een waarde
  roep procedure aan
}

Het probleem is dus dat de "my j" niet gedeclareerd voor de procedure. Daardoor staat hij niet op de variabele stack die wordt gebruikt bij het defineren van de procedure. Als de parser anders zou werken zou het wel kunnen maar schiijnbaar hebben de Perl makkers ervoor gekozen om het zo te doen.
Exacte termen van wat het nu is zou ik op moeten zoeken... is al weer een jaar geleden dat ik daarvan college heb gevolgd :)

Perl vraagje
10 april 2004 - 11:28    reactie #8
geplaatst door: Bram Beernink
Bedankt voor de reactie. Ik snap het nu wel ongeveer. Ik vind echter dat perl dit niet logisch aanpakt.
Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
10 april 2004 - 17:25    reactie #9
geplaatst door: Bram Beernink
Toch nog een dingetje: Dan zou code 2 zonder my toch ook geen uitvoer moeten krijgen?
Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver
Perl vraagje
10 april 2004 - 18:02    reactie #10
geplaatst door: Sander Cox
Dat zou je idd misschien verwachten maar wat er nu gebeurd:
print $j
wordt gevonden, maar $j is nog niet bekend. Hij wordt dan toegevoegd als zijnde de globale variable. En die wordt later weer hergebruikt bij een assignment en hierdoor is het dezelfde variabele... (beetje helder?)
Perl vraagje
10 april 2004 - 21:30    reactie #11
geplaatst door: Bram Beernink
Hartelijk bedankt. Het is wel een beetje helder, maar Larry Wall (e.a.) had(den) dit wel wat duidelijker moeten maken.

(Bewerkt door Bram Beernink om 22:43, 10-04-2004)

Soon there'll be just two kinds of people: Those who use computers, and those who use Apples. - Think different - iMac 15", 768 MB, 700 Mhz G4 - iBook 14", 1GB, 1.42 Ghz G4, 10.5.5 - MessagePad 2000 - iPod nano silver