Schrift
[thread]11831[/thread]

Can't "last" outside a loop block at .....



<< >> 8 Einträge, 1 Seite
esskar
 2008-05-18 23:21
#109885 #109885
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my $count = 10;
do
{
        print "$count\n";
        $count--;
        last if $count == 3;
}
while($count > 0);

print "$count\n";


ging das noch nie?
KurtZ
 2008-05-18 23:27
#109886 #109886
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Nein, geht nicht.
Deswegen u.a. wird in Perl Best Practices davon abgeraten.

EDIT: mehr Infos PBP S.133 "do-while Schleifen"
TMTOWTDYOG (there's more than one way to dig your own grave)
RalphFFM
 2008-05-19 00:27
#109887 #109887
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use warnings;
my $count = 10;
{
        do {
                print "$count\n";
                $count--;
                last if $count == 3;
        }
        while($count > 0);
}
print "$count\n";

Hmm, trotzdem irgendwie unschön, fühle mich plötzlich irgendwie umklammert. ;)
KurtZ
 2008-05-19 00:47
#109888 #109888
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Cool Ralf, ganz schön pfiffig! :-)

Darauf einen nackten Block anzuspringen muss man erstmal kommen, hab mal zur Veranschauung ein Label eingefügt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl
use strict;
use warnings;
my $count = 10;
OUTER:
{
        do {
                print "$count\n";
                $count--;
                last OUTER if $count == 3;
        }
        while($count > 0);
}
print "$count\n";


Habe letztens gelesen das solche Blöcke intern als einmaliges While-Loop behandelt wird, deswegen klappts überhaupt.

Aber ich wär mir nicht sicher obs da nicht irgendwelche blöden Nebeneffekte gibt ... jedenfalls ist dein Workaround knackiger als Conways Vorschläge, man müsste dem Editor jetzt nur noch das Einrücken abgewöhnen.

NACHTRAG: Wobei er andererseits recht hat damit das bei einem Postfix While die Schleifenbedingung schwerer zu erkennen ist.
TMTOWTDYOG (there's more than one way to dig your own grave)
moritz
 2008-05-19 00:48
#109889 #109889
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Ich weiss nicht ob ich das schreiben darf ohne aufgehängt zu werden...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
use warnings;
my $count = 10;
do {
    print "$count\n";
    $count--;
    goto END_OF_LOOP if $count == 3;
}
while($count > 0);
END_OF_LOOP:
print "$count\n";
KurtZ
 2008-05-19 00:53
#109890 #109890
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
moritz+2008-05-18 22:48:39--
Ich weiss nicht ob ich das schreiben darf ohne aufgehängt zu werden...


Ich auch nicht! * fg*

Aber um die Euphorie (meine inklusive) etwas zu dämpfen, diese Workarounds funktionieren nur mit last, nicht mit redound next ... wobei wir wieder bei Conway Vorschlägen wären.
TMTOWTDYOG (there's more than one way to dig your own grave)
moritz
 2008-05-19 01:02
#109891 #109891
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
KurtZ+2008-05-18 22:53:24--
Aber um die Euphorie (meine inklusive) etwas zu dämpfen, diese Workarounds funktionieren nur mit last, nicht mit redound next ... wobei wir wieder bei Conway Vorschlägen wären.


Also ich selbst hab redo komischerweise noch nie benutzt. Dass next nicht geht ist schade.
KurtZ
 2008-05-19 01:29
#109892 #109892
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Redo ist gut wenn du eine Nutzer-Eingabe oder so verwerfen willst.
EDIT: oder hier wo ich n verschiedene Zufallszahlen brauche -> N Zahlen ermitteln mit Gesamtwert 100

hmm verlass dich nicht auf meine Aussage was next anbelangt dass ist alles nicht so klar durchschaubar... und Undurchschaubarkeit ist kein gutes Argument für einen Stil...

Ich hab jetzt die letzte halbe Stunde mal an sowas gebastelt:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my $count = 10;
my $foo=0;
while (1) {

        print $foo++,": $count\n";
        next if ($foo == 2);
        redo if ($foo == 5);

        $count--;

        last if ($count == 3);

        
        last unless
                ($count> 0); # DO-WHILE-CONDITION
}


aber das ganze hat einen üblen Schönheitsfehler, mit next kann ich die Auswertung der END-Condition überspringen. Andereseits hat Conways letzter Workaround mit return aus einer Subroutine den gleichen Makel.
TMTOWTDYOG (there's more than one way to dig your own grave)
<< >> 8 Einträge, 1 Seite



View all threads created 2008-05-18 23:21.