Het MacFreak® Forum - Voor online ondersteuning in het Nederlands!

    Het MacFreak® Forum
     Vragen: Programmeren in C(++), Cocoa, Java, BASIC
         Perl vraagje
                subroutines en my
Welkom bij Vragen: Programmeren in C(++), Cocoa, Java, BASIC 

      Forum gemodereerd door: Moderator  
  Spring naar onderwerp
« Ouder - Nieuwer »  
Onderwerp met meerdere pagina's:
   [ 1 2 ]    Volgende »

    

       
Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 17:23 - 08-04-2004
Ik heb de volgende code:

Code:

#!/usr/bin/perl

my $j = "j";
&printj;

sub printj {
print "$j";
}


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

Code:

#!/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

Sander Cox
Niet Aanwezig




MacFreak Verslaafde
MacFreak Donateur
Aantal berichten: 701 | Lid sinds: 02-09-2002 | Geplaatst om: 19:44 - 08-04-2004
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)

Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 20:22 - 08-04-2004
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

habay
Niet Aanwezig




Account inactief
Aantal berichten: 19 | Lid sinds: 18-03-2004 | Geplaatst om: 23:19 - 08-04-2004
probeer eens:

#!/usr/bin/perl

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

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


Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 10:05 - 09-04-2004
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

Sander Cox
Niet Aanwezig




MacFreak Verslaafde
MacFreak Donateur
Aantal berichten: 701 | Lid sinds: 02-09-2002 | Geplaatst om: 16:49 - 09-04-2004
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

Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 20:57 - 09-04-2004
Gooi maar   




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

Sander Cox
Niet Aanwezig




MacFreak Verslaafde
MacFreak Donateur
Aantal berichten: 701 | Lid sinds: 02-09-2002 | Geplaatst om: 11:17 - 10-04-2004
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  

Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 11:28 - 10-04-2004
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

Bram Beernink
Niet Aanwezig




Een ware MacFreak!
Aantal berichten: 1065 | Lid sinds: 06-07-2002 | Geplaatst om: 17:25 - 10-04-2004
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

       

Spring naar onderwerp
« Ouder - Nieuwer »
Onderwerp met meerdere pagina's:
   [ 1 2 ]    Volgende »

MF-Forum v6.0.0 © 2001/2012 - MacFreak® Interactive Media