Je wist dat
Net::POP3 standaard bij je Perl distributie inzat?
[Ik wil de body van een msg krijgen als een array,] in de documentatie staat bij Body(): Get the body of the specified message, either as an array of lines or as a string, depending on context.
Mijn vraag: hoe krijg ik het als array terug?
Door de aanroep in de goede
context te doen. (Dit is wel erg basic trouwens....

)
In de perlmodule staat het zo:
code:
1
| return wantarray ? split(/[\n\r]+/, $header) : $header; |
Ik neem aan dat wat er staat meer lijkt op $code =~ s'$header'$body'g ?
Heb je vervolgens ook in de docs gekeken naar wat de wantarray functie is en je afgevraagd wat context is (in deze context

)?
In het kort:
Alles wat je in een Perl programma doet gebeurt in een bepaalde context en afhankelijk van de context waarin je iets doet kan het resultaat anders zijn (zoals je gemerkt hebt).
Bijvoorbeeld:
code:
1
2
| my $line = <FILE>; # A: lees 1 regel ...
my @lines = <FILE>; # B: lees alle regels |
Waarom leest B alle (volgende) regels in en A maar eentje? Context.
In A wijs je toe aan een
scalar, wat er voor zorgt dat je een enkele regel terugkrijgt.
In B wijs je toe aan een
array, wat zorgt voor een list context. Gevolg: je krijgt alle regels terug.
Wat heeft dat nou met jouw probleem te maken? Als je
code:
1
| my $body = $pop->Body(1); |
doet, vraag je om de body in een scalar context en krijg je dus de body als een scalar (een ding, een geheel) terug.
Als je de body als een array wilt terug krijgen kan je dit doen:
code:
1
| my @body = $pop->Body(1); |
(let op de array in plaat van een scalar.)
De Body methode kan dmv de wantarray functie bekijken in welke context hij aangeroepen wordt en bepaalt op grond daarvan welk resultaat hij geeft:
code:
1
| return wantarray ? split(/[\n\r]+/, $body) : $body; |
In een list context krijg je een array terug van regels, anders krijg je de body als een enkele string.
Zie verder
de docs. (Nogmaals: context is toch wel een redelijk belangrijk idee in Perl...)