Perl:Leksikalsk

Fra CodeWiki

Gå til: navigasjon, søk

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.

Personlige verktøy
dataprogrammering
generelt