Perl:Leksikalsk
Fra CodeWiki
Perl hadde fra versjon 1 dynamisk scope for alle variabler. Det betød at hver variabel var synlig i hele programmet. Greit for bittesmå programmer, men veldig upraktisk for større systemer.
Leksikalsk scoping betyr at du avgrenser synbarheten til hver variabel til det området der det er aktuelt å bruke dem. Leksikalsk scoping betyr også at samme variabelnavn trygt kan brukes i ulike deler av koden, uten at verdien av f.eks. $antall et sted påvirker bruken av $antall et helt annet sted i koden.
Du ber Perl forlange (blant annet) leksikalsk scoping ved å sette use strict; øverst i koden. Du deklarerer en leksikalsk variabel ved å bruke my;
# $antall finnes ikke her { my $antall = 10; # men her } # her finnes ikke $antall lenger, men kan introduseres på nytt my $antall = 7000;
Hvis du forsøker å bruke en leksikalsk variabel utenfor området sitt:
#!/usr/bin/env perl use strict; use warnings; my $sykler = 20; { my $biler = 10; print "Vi har $sykler sykler og $biler biler \n"; # ok } print "Her har vi $sykler sykler og $biler biler \n"; # Oops! $biler finnes ikke her
Hvis du kjører programmet over får du:
Global symbol "$biler" requires explicit package name at cw_p_lexical.pl line 8. Execution of cw_p_lexical.pl aborted due to compilation errors.
Men dersom du ikke hadde use strict; use warnings; ville du fått:
Vi har 10 sykler og 20 biler Her har vi 10 sykler og biler
Programmet kjører uten feilmeldinger eller advarsler, men produserer en feil som kan være ganske subtil, vanskelig å oppdage, særlig dersom det hadde vært en tilordning og ikke en utprinting. Moralen er: bruk use strict; use warnings og my alle variablene dine.
