
08-27-2005
|
|
Advisor
|
|
|
Join Date: Sep 2002
Beliggenhed: Hong Kong, Kina
Stillinger: 1624
|
|
At holde tingene lokale, der skal være lokale er en god husholdning praksis.
Teknisk set, ved hjælp af lokale (min) variabler skyldes behovet for at fjerne namespace sammenstød, men faktum er, det har en noget intet formål. Det er, at sørge for rammerne af en variabel afhænger udelukkende af den leksikale anvendelsesområde alene. Så du kan fortælle omfanget af det variable direkte ved at kigge inden for den nuværende blok og ingen andre steder. Subrutiner aktiveres fra i denne blok vil ikke se den variable. så,
Code:
{ # BLOCK 1
my $var = 10;
{ # BLOCK 2
local $var2 = 100;
&mysub;
print "\$var = $var\n"; # (1)
print "\$var2 = $var2\n"; # (2)
}
$var += 10;
print "\$var = $var\n"; # (3)
print "\$var2 = $var2\n"; # (4)
}
&mysub;
print "\$var = $var\n"; # (5)
print "\$var2 = $var2\n"; # (6)
sub mysub {
$var += 2;
$var2 += 2;
}
Du kan fortælle, at omfanget af "min $ var" er inden BLOK 1, men ikke til subrutiner kaldes indeni. Altså (1) og (3) er 10 og 20 hhv. Så som $ var gjorde mysub () ændring i delrutinen? Det er den globale $ var, som er vist i (5), "4" (2 besværgelser), efter at omfanget af "my $ var" udløber. Som du kan være sikker på omfanget (i stedet for afhængig af kaldstakkens, dvs indlejring af subrutiner at blive kaldt), vil det være lettere at rette fejl, når værdien går galt. Perl giver dig også en variant "lokale", som gennemfører anvendelsesområdet-afhængige-on-call-stack politik (sjælden blandt almindeligt i brug programmeringssprog i dag), så (2), (4), (6), er 102, undef og 2. Dette er en ulempe, at omfanget afhænger af kaldstakkens på kørselstidspunktet, så det er mere forvirrende.
Hvis du har brug for at beskæftige sig med referencer, kan du blive nødt til at udløbe en datastruktur peget på en henvisning på et bestemt tidspunkt i livet af scriptet ved at kontrollere levetiden af referencerne. Hvis dine referencer er angivet med lokale variabler, de vil naturligvis komme uden for rækkevidde, når de indeholder blok opsiger og derefter få ryddet op. Ellers vil referencer som globale variabler hængende, medmindre du overflytte sin værdi. Dette øger chancen for sammenstød, hvis du glemmer at gøre det.
Men huske på, at Perl globale variabler er ikke ægte global (se perlmod manpage), men yderligere underlagt pakken (alias navnerummet) mekanisme. Pakke er den metode, der tager navn sammenstød. Det er vigtigt, da vi bygge komponenter, der er beregnet til at blive genanvendt, så vi ønsker ikke, $ navn er defineret i en komponent, der benyttes til at kollidere med en anden $ navn i mit program. Men jeg kan ikke gå i detaljer om pakker her. Se perlmod manpage eller relevant litteratur for detaljer.
Dette forklarer, hvorfor du skal prøve at sætte din kode i moduler (i det mindste, i forskellige pakker) og bruge lokale variabler det meste af tiden. Ikke alene dette gør din kode mere genbruges, det hjælper også undgå en masse problemer i det lange løb som din kode bliver mere kompliceret, når du forsøger at holde stumper og stykker sammen.
|