ProgrammatieBackend ontwikkelaar

Wat zijn de kenmerken van het werken met de verwerking van een lijst met argumenten in Perl-subprogramma's en hoe retourneer je waarden correct uit een functie?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

In Perl accepteren subprogramma's argumenten via een speciale variabele-array @_, waar automatisch alle doorgegeven parameters in worden geplaatst. Een kenmerk van Perl is dat parameters als een referentie naar @_ komen, wat betekent dat het wijzigen van elementen binnen de functie hun waarden van buitenaf verandert.

Om onverwachte wijzigingen in de doorgegeven gegevens te voorkomen, wordt aangeraden om de parameters te kopiëren naar variabelen:

sub sum { my ($a, $b) = @_; return $a + $b; }

Perl-functies retourneren altijd een lijst van waarden, en het resultaat van de functie is de laatste berekende lijst of een expliciete return-instructie.

sub minmax { my ($x, $y) = @_; return ($x < $y ? $x : $y, $x > $y ? $x : $y); } my ($min, $max) = minmax(4, 7); # $min = 4; $max = 7

Als je de functie in een scalair context aanroept, retourneert deze het aantal geretourneerde elementen, tenzij het resultaat in een scalair wordt geplaatst.


Valentijnsflash

Hoe geef je een groot aantal variabelen door aan een Perl-functie zonder per ongeluk de waarden van de oorspronkelijke variabelen te wijzigen?

Onbewust antwoorden ze: "Je moet gewoon argumenten naar variabelen kopiëren zoals gewoonlijk!"

Juist antwoord:

Kopiëren werkt alleen voor scalars. Als je met arrays of hashes werkt, gebruik dan referenties om de gegevensoverdracht expliciet te beheren en om kopieën via referentie te vermijden:

sub modify { my ($arr_ref) = @_; push @$arr_ref, 'new'; # wijzigt de oorspronkelijke array } my @data = (1, 2, 3); modify(\@data); # nu is @data = (1, 2, 3, 'new')

Geschiedenis


Geschiedenis 1

In een groot script voor rapportage wijzigde een interne functie de waarden van de array-elementen die vanuit het hoofprogramma werden doorgegeven. Als gevolg hiervan waren de oorspronkelijke gegevens na uitvoering van de functie vervormd. De fout was dat de auteur van de functie geen kopieën van de invoerwaarden maakte, denkend dat de wijzigingen lokaal zouden zijn - wat niet waar is voor @_ met arrays.


Geschiedenis 2

Bij de migratie van scripts van Perl 4 (waar variabelen anders werden gekopieerd) stuitte het team op een probleem: het doorgeven van geneste hashes leidde tot onverwachte "lekken" van gegevens tussen aanroepen van subprogramma's - het wijzigen van hash-velden in één functie beïnvloedde andere delen van de code. De reden was de referentie naar de hash in de lijst @_.


Geschiedenis 3

Een ontwikkelaar implementeerde een functie die een array van resultaten retourneert, maar gebruikte op de aanroepplek een scalair context: $count = func(@params);. Verwacht werd dat de variabele de waarde van het eerste geretourneerde element zou krijgen, maar in werkelijkheid bleek $count het aantal elementen in de lijst te zijn, wat leidde tot vertragingen in berekeningen en verwarring.