Toon posts:

[perl] array vraagje

Pagina: 1
Acties:

Verwijderd

Topicstarter
hellow,

ik gebruik de module POP3Client.pm

als ik de body van een msg terug wil hebben doe ik bijv:
$pop->Body(1)

alleen wil ik het terug hebben als een array,
in de documentatie staat bij Body():
Body( MESSAGE_NUMBER )

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?

In de perlmodule staat het zo:
code:
1
return wantarray ? split(/[\n\r]+/, $header) : $header;

Verwijderd

Topicstarter
hmm ik weet het al......

moest hem bijv zo:
code:
1
2
3
4
foreach $regel ($pop->Body(1))
{
  print "$regel\n";
}

aanroepen

logisch eigenlijk :Z

Verwijderd

woeitje: Ik gebruik de module POP3Client.pm.
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.... :o)
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 :P)?

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...)

Verwijderd

woeitje: Hmm ik weet het al... Moest hem bijv zo:
code:
1
2
3
4
foreach $regel ($pop->Body(1))
{
  print "$regel\n";
}

aanroepen. Logisch eigenlijk :Z
:o Ehm... Niet de meest fraaie oplossing...

Waarom dan niet zo?
code:
1
print join "\n" => $pop->Body(1);

Of zo?
code:
1
print scalar $pop->Body(1);

Verwijderd

Topicstarter
Op dinsdag 09 april 2002 15:41 schreef Arien het volgende:

[..]

:o Ehm... Niet de meest fraaie oplossing...
bedankt voor al je uitleg :D

owja en die niet zo fraaie oplossing was gewoon een voorbeeldje, ik moet met elke regel wat handelingen doen, vandaar dat ik het niet in 1 keer print, want dan had ik netzogoed print $pop->Body(1); kunnen doen :)

Verwijderd

woeitje: Die niet zo fraaie oplossing was gewoon een voorbeeldje, ik moet met elke regel wat handelingen doen, vandaar dat ik het niet in 1 keer print, want dan had ik netzogoed print $pop->Body(1); kunnen doen :)
En je newlines zijn dan waar? >:)

Die handelingen zullen wel tekst manipuleren (regexen) zijn? Dan lijkt me een scalar wel zo handig ipv een array. :)
Pagina: 1