/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Exiting subroutine via next at test.pl lin~
Fra : Jens Thomsen


Dato : 13-10-07 08:52

Hvordan får man next til at virke i en sub, så der printes WHAT! ?



#!/usr/bin/perl

use strict;
use warnings;

$SIG {__WARN__} = sub { die (@_) };


while (1)
{
nextie ();
print STDERR "WHAT!\n";
}

sub nextie
}
next;
}



 
 
Peter Makholm (13-10-2007)
Kommentar
Fra : Peter Makholm


Dato : 13-10-07 09:04

"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å.

//Makholm

Jens Thomsen (13-10-2007)
Kommentar
Fra : Jens Thomsen


Dato : 13-10-07 09:22


"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?
Grimt er det

Er der andre alternativer?







Michael Zedeler (13-10-2007)
Kommentar
Fra : Michael Zedeler


Dato : 13-10-07 19:21

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.

Adam Sjøgren (13-10-2007)
Kommentar
Fra : Adam Sjøgren


Dato : 13-10-07 11:25

On Sat, 13 Oct 2007 10:21:52 +0200, Jens wrote:

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

Hvis dine funktioner har brug for at "kalde" både next og last i
forskellige situationer er det måske værd at overveje om du har
struktureret din logik fornuftigt?

Jeg synes det lugter lidt af spaghetti.

> 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?
> Grimt er det

Kun når der er flere logiske forgreninger alt efter hvad funktionerne
returnerer.

Dette, f.eks.:

while(1) {
next if (!sub1());
last if (!sub2());
}

ser ikke specielt grimt ud i mine øjne¹.

> Er der andre alternativer?

Omtænk strukturen?


Mvh.

Adam


¹ Med mindre postfix notationen betegnes som grim

--
"If not actually disgruntled, he was far from being Adam Sjøgren
gruntled." asjo@koldfront.dk

Adam Sjøgren (13-10-2007)
Kommentar
Fra : Adam Sjøgren


Dato : 13-10-07 11:49

On Sat, 13 Oct 2007 12:30:54 +0200, Flemming wrote:

> Adam Sjøgren wrote:

>> last if (!sub2());

> Well, jeg ville nok have skrevet:
> last unless sub1;

Jeg er en stor fan af at skrive det jeg tænker. I dette tilfælde var det
"sidste tur i løkken, hvis sub2 går galt".

Og ikke "sidste tur i løkken, med mindre sub2 går godt".

Resultatet er naturligvis fuldstændigt det samme, eneste forskel er
"afsløringen" af forfatterens intention.

Den anden dårlige vane jeg afslører ovenfor, er at jeg har en tendens
til altid at have paranteser rundt om udtrykket som if/unless evaluerer.

Så bliver jeg fri for at tænke synderligt over præcedens, når jeg
udvider udtrykket fra bare en simpel test på en enkelt variabel til et
mere kompliceret udtryk.

Paranteserne efter funktionsnavnet var bare så jeg blev fri for at
definere sub1 og sub2 før while-løkken.

> Så ligner det ikke helt så meget lisp...

Hvad er der nu galt med lisp?


C-c C-c,

Adam

--
"He who writes the code chooses the Adam Sjøgren
license, and anyone else is a whiner." asjo@koldfront.dk

Adam Sjøgren (13-10-2007)
Kommentar
Fra : Adam Sjøgren


Dato : 13-10-07 14:45

On Sat, 13 Oct 2007 15:35:46 +0200, Jens wrote:

> Jeg kiggede på logikken og indså at jeg ikke helt havde fået mig omstillet
> til at det nu var subs jeg havde med at gøre, så de er nu ændret til at
> returnere 1 og 0 og så ved jeg om jeg skal next'e.
> last er sparet væk

Herligt!

> Tak for hjælpen.

Det er (også) hvad vi har usenet til


Mvh.

Adam

--
"HALLELUJAH! Adam Sjøgren
Så att säga." asjo@koldfront.dk

Michael Zedeler (13-10-2007)
Kommentar
Fra : Michael Zedeler


Dato : 13-10-07 19:16

Jens Thomsen wrote:
> Hvordan får man next til at virke i en sub, så der printes WHAT! ?
>
> #!/usr/bin/perl
>
> use strict;
> use warnings;
>
> $SIG {__WARN__} = sub { die (@_) };
>
> while (1)
> {
> nextie ();
> print STDERR "WHAT!\n";
> }
>
> sub nextie
> }
> next;
> }

Det der er en goto i forklædning. Hvis du vil skrive kode, der opfører
sig sådan, er der noget alvorligt galt. Hvor har du tænkt dig at bruge det?

Mvh. Michael.

Peter Makholm (13-10-2007)
Kommentar
Fra : Peter Makholm


Dato : 13-10-07 19:37

Michael Zedeler <michael@zedeler.dk> writes:

> Det der er en goto i forklædning. Hvis du vil skrive kode, der opfører
> sig sådan, er der noget alvorligt galt. Hvor har du tænkt dig at bruge
> det?

Der er intet i vejen med goto'er i forklædning. Goto'er der virker
lokalt og ikke hopper ukontroleret ud og ind af blokke er der egentlig
ikke noget i vejen med.

//Makholm


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste