ProgrammatiePerl ontwikkelaar

Vertel hoe arrays, hashes en scalars in Perl worden geïnterpoleerd in verschillende type strings, en welke gevaren verbonden zijn aan dit mechanisme.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl is er ondersteuning voor interpolatie (variabele substitutie) in dubbele aanhalingstekens ("") en in bepaalde sjablonen (bijvoorbeeld, heredoc). Scalars worden eenvoudig geïnterpoleerd:

my $name = 'Bob'; print "Hello, $name! "; # Hello, Bob!

Arrays in dubbele aanhalingstekens worden na substitutie omgezet in een string waarin de elementen gescheiden zijn door het teken $" (standaard is dit een spatie):

my @items = ('a','b','c'); print "Lijst: @items "; # Lijst: a b c

Hashes worden als een string van sleutel=>waarde, gescheiden door het teken $; geïnterpoleerd:

my %h = (x => 1, y => 2); print "Hash: %h "; # Hash: x1y2 (kan verschillen)

In enkele aanhalingstekens (' ') wordt er niets geïnterpoleerd — de string wordt letterlijk weergegeven.

Het is ook mogelijk om complexe expressies voor interpolatie te gebruiken door accolades:

print "${name}_test "; # Bob_test

Het gevaar — onbedoelde interpolatie van speciale tekens en verschillende gedragingen van arrays, hashes en scalars.


Vragend met een valstrik

Waarom werkt de string "Totaal: $total$val" soms niet correct?

Een veelgehoord antwoord: "Alles wordt als is substitueert!"

Correct antwoord:

De string "Totaal: $total$val" kan alleen de variabele $total correct substitueren; de variabele $val kan niet worden herkend of Perl kan een onjuiste range interpoleren als de namen van de variabelen vergelijkbaar zijn. Om ambiguïteit te vermijden, gebruik accolades:

print "Totaal: ${total}${val} ";

Geschiedenis


Geschiedenis 1

In de rapporten zag de somstring eruit als: "Totaal: $sum roebel." Na het toevoegen van de variabele $rub in de code werd de string "Totaal: $sum$rub", waardoor de interpolatie alleen werkte voor $sum$, terwijl $rub werd overgeslagen, wat leidde tot waarschuwingen. Niemand begreep het totdat ze de lege string op de uitvoer zagen.


Geschiedenis 2

Bij het vormen van een SQL-query werd de interpolatie van de array via @values gebruikt zonder join: "IN (@values)". Dit leidde tot een string met een spatie als scheidingsteken in plaats van de verwachte lijst door komma's. Eindresultaat — een fout in SQL en een onjuiste selectie.


Geschiedenis 3

Voor het weergeven van de lijst met sleutels van de hash werd %h in de string gebruikt: "Sleutels: %h". Dit resulteerde in een samengevoegde string van sleutel-waarde in plaats van een goede lijst van sleutels. Het had moeten zijn: join ", ", keys %h.