Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11235[/thread]

redo erzeugt Endlosschleife (war: Ich find den Fehler nicht!!!) (Seite 2)

Leser: 2


<< |< 1 2 >| >> 17 Einträge, 2 Seiten
betterworld
 2008-02-03 22:23
#105529 #105529
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Dieses konkrete Beispiel koennte man auch implementieren, ohne dass etwas gleichzeitig passieren muss. In perldoc -f alarm steht mehr darueber.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use strict;
use warnings;

my $line;

$|++;
{
    print "    0s: ";

    my $secs = 0;
    local $SIG{ALRM} = sub {
        printf("\e7\r%5ds:\e8", ++$secs);
        alarm(1);
    };
    alarm(1);

    $line = <STDIN>;

    alarm(0);
}

chomp $line;
print "Danke, dass Sie $line eingegeben haben.\n";


Aber dazu gibt es bestimmt auch ein Modul bei CPAN...

Ach ja: bitte pro Thread nur ein Thema. Beim naechsten Thema, das Du anfaengst, eroeffne bitte einen neuen Thread (mit besserem Titel als "Ich find den Fehler nicht" -- den Titel von diesem Thread hab ich mal verbessert).
Struppi
 2008-02-03 23:10
#105530 #105530
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
pl+2008-02-03 13:49:36--
Ich habs jetzt endlich:
In meinem Code fehlt das next!
Code: (dl )
1
2
3
4
5
        if ($ai == $zeitspanne) {
print @letters;
next;
}
redo;

Das redo ist Murks und das next auch, da in der Schleife nichts weiter passiert.
styx-cc
 2008-02-04 02:48
#105531 #105531
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Struppi+2008-02-03 22:10:55--
pl+2008-02-03 13:49:36--
Ich habs jetzt endlich:
In meinem Code fehlt das next!
Code: (dl )
1
2
3
4
5
        if ($ai == $zeitspanne) {
print @letters;
next;
}
redo;

Das redo ist Murks und das next auch, da in der Schleife nichts weiter passiert.
Wieso? Er tritt sozusagen so lange auf der Stelle, bis das if einmal erfuellt ist, dann rutscht er in der Liste eins weiter. Und da die Schleife oefters als 1x pro Sekunde ausgefuehrt wird ist das ganz sinnvoll..
oder schlafe ich immer noch?
Pörl.
Struppi
 2008-02-04 10:17
#105534 #105534
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Klasse, jetzt versteh ich was der Code machen soll.

Er soll eine gewisse Zeitspanne warten und dazu benutzt pl eine Art Endlosschleife. Ich kann mich täuschen, aber kann man sowas nicht mit sleep machen?
Also in etwa so:
Code (perl): (dl )
1
2
3
4
    foreach $ai (@ai) {
        sleep($a1);
        print @letters
}


Aber selbst wenn man das unbedingt mit einer Schleife machen will, geht es ohne redo und next.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/perl -w
use strict;
use constant CR => "\r";
use constant NL => "\n";
my @x = qw(2 6 8 12);
print "start";
$|++;
foreach(@x) {
        print NL, "warte ....", CR;
        warte($_);
        print "$_ sekunden vorbei.";
}

sub warte{
        my $wait = shift;
        my $t1 = time();
        while(1) {
                my $t2 = time();
                my $diff = $t2 - $t1;
                last if($diff == $wait);
        }

}
murphy
 2008-02-04 15:40
#105548 #105548
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Am besten wäre es doch eigentlich, sleep zu verwenden und trotzdem eine Schleife herumzubauen, um sicherzustellen, dass auch lange genug geschlafen wird -- sleep könnte schließlich von einem Signal unterbrochen werden.

Beispiel:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
sub sleep_at_least($) {
  my $rest = shift;
  $rest -= sleep $rest while ($rest > 0);
}

$SIG{ALRM} = sub {
  print "Alarm!\n";
};

alarm 3;
sleep_at_least 10; # wartet trotz des zwischenzeitlich auftretenden Alarmsignals mindestens 10 sec

When C++ is your hammer, every problem looks like your thumb.
MatthiasW
 2008-02-04 16:27
#105551 #105551
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Möchte man in Millisekunden warten, kann man select() missbrauchen:
Code: (dl )
1
2
my $ms = 3500; # zeit in millisekunden
select( undef, undef, undef, $ms / 1000 );

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Taulmarill
 2008-02-04 16:31
#105552 #105552
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
...oder CPAN:Time::HiRes

Ich habe letztens mal ein kleines Script gebaut, welches zu jeder vollen Sekunde etwas tun soll (ist für die Darstellung der Uhrzeit nützlich). Falls es von Interesse ist:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use Time::HiRes qw( usleep gettimeofday );

while ( 1 ) {
    usleep 1_000_000 - (gettimeofday)[1];
    &do_stuff();
}

sub do_stuff {
    print Time::HiRes::time . "\n";
    1;
}
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-02-03 13:03.