Jens Thomsen wrote:
> "Peter Makholm" <peter@makholm.net> wrote in message
> news:87przjsaoh.fsf@hacking.dk...
>> "Jens Thomsen" <jt@nej.nej> writes:
>>
>>> Hvordan får man next til at virke i en sub, så der printes WHAT! ?
>> Det gør du ikke. next virker kun på løkkestrukture i samme scope. Er
>> det ikke return du har brug for? Ellers må du lige forklare præcis
>> hvilken effekt du ønsker at opnå.
>
>
> Jeg har to kodeblokke, som er rimeligt lange.
> De ligger normalt i min while (1).
> For læsbarhedens skyld ville jeg skille dem ud i hver deres sub, så løkken
> blev
>
> while (1)
> {
> sub1 ();
> sub2 ();
> }
>
> Imidlertid er der situationer, hvor enten sub1 eller sub2 har brug for at
> kalde next og last, men som du siger er de jo i et andet scope og virker
> derfor ikke.
>
> Høkerløsningen er måske at anvende return i dem og i main evaluere på
> returværdierne, så jeg returnerer "NEXT" eller "LAST" og så kalder de
> kommandoer?
Det komme vel an på hvad man skal forstå ved deres returværdier. Hvis
funktionerne er rimelig logisk definerede, så deres ansvarsområder ikke
overlapper, er der ikke noget galt i konstruktioner som dette her:
while( 1) {
next unless sub1();
sub2();
}
Du får ikke meget ud af at kalde next efter sub2() ovenfor.
> Grimt er det
Det er kun grimt hvis koden bliver uforståelig eller bryder med
almindelige principepr som indkapsling (det er hvad du oprindeligt var
igang med).
> Er der andre alternativer?
Ja. Du kan indlejre den ene rutine i den anden:
while(1) {
last unless sub1();
}
sub sub1 {
my $result = 0;
...gør noget...
$result ||= sub2();
...gør noget mere...
return $result;
}
Mvh. Michael.