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

Zeitbegrenzung für reguläre Ausdrücke



<< |< 1 2 3 4 5 >| >> 41 Einträge, 5 Seiten
Crian
 2005-04-25 13:24
#54161 #54161
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich suche nach einer Möglichkeit, reguläre Ausdrücke "abzuschießen", wenn sie länger als eine vorgegebene Zeit laufen. Da die perlsche Regex-Maschine diese Möglichkeit nicht von Haus aus bietet, muss ich mir irgendetwas anderes einfallen lassen.

Z.B. Ausführen als externes Programm, dass ich ggf. abschieße, wenn es zu lange braucht, oder Start der alarm-Funktion, die dann irgendwas macht.

Mir ist aber nicht klar, wie genau das gehen soll, hat dazu irgend jemand einen Tipp?

Ich hab auf CPAN schon gesucht, aber da gibts so viele RE-Module, dass ich bisher nichts brauchbares gefunden habe.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Ronnie
 2005-04-25 13:29
#54162 #54162
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Kannst du nicht forken und dann den Prozess killen wenn er zu lange läuft?
Strat
 2005-04-25 15:06
#54163 #54163
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
fuer alarm ist ein recht nettes beispiel unter perldoc -f alarm drinnen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-04-25 15:15
#54164 #54164
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
@ronnie: Das wollte ich nur im Notfall

[quote=Strat,25.04.2005, 13:06]fuer alarm ist ein recht nettes beispiel unter perldoc -f alarm drinnen...[/quote]

schick, genau was ich brauche, so weit ich sehen kann :) :D :) danke für den Tipp.

Hier der Code aus dem perldoc:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
                eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}


Ich finde, man könnte dem inneren die ruhig $@ mitgeben. Weiß jemand, warum das \n wohl nötig ist? Ist eigentlich egal, find ich nur interessant.\n\n

<!--EDIT|Crian|1114427805-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2005-04-25 15:17
#54165 #54165
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du ohne Zeilenumbruch am ende schreibst:
Code: (dl )
die "irgendwas"

was kommt dann?
sowas wie irgendwas at line xyz...
und dann kannst du nicht mehr mit eq vergleichen, sondern brauchst eine RE oder index oder sowas...
der zeilenumbruch unterdrueckt die zeilennummer...\n\n

<!--EDIT|Strat|1114427950-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2005-04-25 15:37
#54166 #54166
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
ach ja klar
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
steffenw
 2005-04-25 16:19
#54167 #54167
User since
2003-08-15
692 Artikel
BenutzerIn
[Homepage] [default_avatar]
Gelöscht, ich habe zu lange gebraucht, @Strat war schneller.\n\n

<!--EDIT|steffenw|1114431773-->
$SIG{USER} = sub {love 'Perl' or die};
Crian
 2005-04-25 16:52
#54168 #54168
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
So, ich hab das Beispiel mal bei mir angepasst eingebaut, leider bricht er aber nicht nach den angegebenen 15 Sekunden ab. Der Code sieht jetzt so aus:


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
use constant TIMEOUT => 15; # Sekunden, nach der eine Regel abgeschossen wird.

...

my @allmatch;
my ($m1, $m2, $m3);
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm TIMEOUT;
@allmatch = $ts =~ $composite->data()->[$i]->{re};
($m1, $m2, $m3) = ($`, $&, $');
alarm 0;
};
if ($@) {
die "Matcherror: $@\n" unless $@ eq "alarm\n"; # propagate unexpected errors
# Markieren, dass dieser Satz wegen timeout nicht vollständig bearbeitet ist!
warn "ABBRUCH WEGEN ZEITUEBERSCHREITUNG (Regel $regelname)\n";
next SENTENCE;
}
...


Hab ich irgendwas dummes übersehen oder liegt hier ein grundsätzliches Problem vor?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
betterworld
 2005-04-25 17:00
#54169 #54169
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Was steht denn in $composite und den anderen Variablen?

Prinzipiell sollte der Ansatz richtig sein. Folgendes funktioniert auch:
Code: (dl )
perl -le '$SIG{ALRM}=sub {print "abgebrochen"};alarm(2); "" =~ m/(?{{sleep 3}})/'
Strat
 2005-04-25 17:33
#54170 #54170
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
welche perl-version hast du?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 3 4 5 >| >> 41 Einträge, 5 Seiten



View all threads created 2005-04-25 13:24.