Schrift
[thread]10337[/thread]

Unmatched [ in regex

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Gast Gast
 2007-09-07 01:09
#99168 #99168
Hi leute,
ich kenn mich absolut mit perl nicht aus,
hab aber ein script der auf dem server laufen muss, läuft eigentlich auch ohne probleme bis auf das

Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE ]/ at ..... line 575.

dass ist so ein trivia bot bei der text aus einer datei gelesen wird und ans jabber geschickt wird.
ich denke dass es bei den texten die [ beinhalten zu problemen kommt.
die zeile sieht so aus.
Code (perl): (dl )
1
2
3
574:$Question = (split(/[$d][$d]/,$QuestionLine))[1];
575:        $Category = (split(/[$d]/,$QuestionLine))[1];
 576:       $Answer = (split(/[$d]/,$QuestionLine))[2];

kann man das nicht irgendwie parsen?
Linuxer
 2007-09-07 01:20
#99169 #99169
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

das Problem tritt wahrscheinlich auf, wenn $d undef ist oder den Leerstring enthält.

Dann wird aus m/[$d]/ ein m/[]/ ; die schliessende Klammer wird dann als Zeichen der Zeichenklasse gewertet, wodurch die schliessende Klammer dann fehlt.

Prüfe vorher, ob $d einen gültigen Wert hat.

Achso; und verwende bitte use strict; und use warnings;, falls Du es noch nicht einsetzt.
Mit "use warnings;" sollte Dir beispielsweise die Verwendung nicht initialisierter Variablen angezeigt werden.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2007-09-07 02:11
#99171 #99171
du hast recht,
ich hab use warnings; eingefügt dann kommt das als fehlermeldung


Use of uninitialized value in substr at .... line 572.
Use of uninitialized value in split at .... line 574.

zeile 572:
$d = substr($QuestionLine,0,1);

hmm wenn ich es per if abfrage wie beende ich dann die funktion und ruf sie anschließend nochmal auf?
weill das ist in der funktion drinnen wo die fragen erstellt werden.
Linuxer
 2007-09-07 02:37
#99172 #99172
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

meinst Du sowas?
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if ( defined $QuestionLine and $QuestionLine ne '' ) {

  $d =  substr( $QuestionLine, 0, 1 );

  # mehr tun mit $d, etc.

  # Sub beenden und skalare 1 (im Sinne v. TRUE) zurueckliefern
  # alternativ such Dir nen Wert, der hier sinnvoll generiert
  # werden koennte, und liefer den zurueck (wenn er denn
  # ausserhalb sinnvoll verwendet/geprueft werden kann)
  return scalar 1;
}
else {
  # was tun, weil $QuestionLine nicht definiert ist
  # Sub beenden und undef als Fehlerzeichen zurueckgeben
  return undef;
}


Wenn Du mehr Infos lieferst, wie denn der konkrete Kontext Deines Problems ausschaut, könnte man auch konkretere Vorschläge machen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2007-09-07 02:48
#99173 #99173
hi zuerst mal danke dass du um diese Uhrzeit noch hilfst.
Also es ist so hab ne Funktion GetQuestion
da wird die Datei geöffnet per zufall eine Zeile ausgelesen und dann zerschnitten und anschließend retour gegeben.

ich füg am besten den code hier dann siehst es selber.



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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sub GetQuestion {
        $PointValue = $ScoreValues[rand($#ScoreValues)];
        if (rand(15) == 0) { $PointValue *= 2; }
        $FileNum = int(rand($TotalFiles))+1;
        $QNum = int(rand($QuestionDBinfo{$FileNum}[1]))+1;
        open(QFILE, $QuestionDBinfo{$FileNum}[0]) or die "Error opening the trivia file\n";
        for($i = 0; $i < $QNum; $i += 1) {
                $QuestionLine = <QFILE>;
        }
        close(QFILE);

        $d = substr($QuestionLine,0,1);
        $Question = (split(/[$d][$d]/,$QuestionLine))[1];
        $Category = (split(/[$d]/,$QuestionLine))[1];
        $Answer = (split(/[$d]/,$QuestionLine))[2];
        $QID = "F".$FileNum.".Q".$QNum;
        chomp($Question);
        if ($Category eq "Scramble") {
                @letters = ();
                for($i=0;$i<length($Question);$i+=1) {
                        push(@letters,substr($Question,$i,1));
                }
                @letters = shuffle(@letters);
                $Question = "";
for($i=0;$i<scalar(@letters);$i+=1) {
                        $Question = $Question." ".$letters[$i];
                }
                $Question = "Unscramble this word: ".$Question;
                $l = length($Answer) - 5;
                while ($l >= 0) {
                        if (int(rand(2)) == 1) { $PointValue *= 2; }
                        $l -= 3;
                }
        }

        @retval = ($PointValue, $QID, $Category, $Question, $Answer);

        return @retval;
}


die Funktion wird wiederum in einem andren Funktion aufgerufen.
Code (perl): (dl )
@Q = &GetQuestion;


wie löse ich das am besten???
topeg
 2007-09-07 08:27
#99175 #99175
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
sub GetQuestion {
         my $PointValue=shift(@_);
         my $TotalFiles=shift(@_);
         my $QuestionDBinfo=shift(@_);

         if (rand(15) == 0) { $PointValue *= 2; }
         my $FileNum = int(rand($TotalFiles))+1;
         my $QNum = int(rand($$QuestionDBinfo{$FileNum}[1]))+1;
         my $QuestionLine; # hier war der Hauptfehler "$QuestionLine" existierte nur innerhalb von "for"
         open(QFILE, $$QuestionDBinfo{$FileNum}[0]) or die "Error opening the trivia file\n";
         for($i = 0; $i < $QNum; $i += 1) {
                 $QuestionLine = <QFILE>;
         }
         close(QFILE);
         die "No string read from the trivia file!" if ($QuestionLine eq '');
         # Trenner ermitteln?
         my $d = substr($QuestionLine,0,1);
         # was machst du hier???
         my $Question = (split(/[$d][$d]/,$QuestionLine))[1];
         my $Category = (split(/[$d]/,$QuestionLine))[1];
         my $Answer = (split(/[$d]/,$QuestionLine))[2];
         # so wie das da steht macht es keinen Sinn.
         # gib mal eine Beispielzeile.
         # wenn ich den Code richtig interpretiere sieht eine Questionline so aus:
         # ;Kategorie;Frage;Antwort
         # Ein korrekter Trenner sähe wohl so aus:
         # my ($Category,$Question,$Answer)=(split($d,$QuestionLine))[1,2,3];
         my $QID = "F".$FileNum.".Q".$QNum;
         chomp($Question);
         if ($Category eq "Scramble") {
                 my @letters = ();
                 for($i=0;$i<length($Question);$i+=1) {
                         push(@letters,substr($Question,$i,1));
                 }
                 @letters = shuffle(@letters);
                 $Question = "";
                 for($i=0;$i<scalar(@letters);$i+=1) {
                         $Question = $Question." ".$letters[$i];
                 }
                 $Question = "Unscramble this word: ".$Question;
                 my $l = length($Answer) - 5;
                 while ($l >= 0) {
                         if (int(rand(2)) == 1) { $PointValue *= 2; }
                         $l -= 3;
                 }
         }
 
         my @retval = ($PointValue, $QID, $Category, $Question, $Answer);
 
         return @retval;
 }

# Aufruf:
@list=GetQuestion($ScoreValues[rand($#ScoreValues)],$TotalFiles,\@QuestionDBinfo);

Nebenbei: Globale Variablen sind des Teufels! ;-)
renee
 2007-09-07 09:58
#99176 #99176
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
open(QFILE, $$QuestionDBinfo{$FileNum}[0]) or die "Error opening the trivia file\n";


sollte man nicht so schreiben... Was, wenn der Dateiname '>/etc/passwd' oder so etwas ist?

Besser die 3-Arg-Schreibweise nehmen:

Code (perl): (dl )
open(QFILE, '<', $$QuestionDBinfo{$FileNum}[0]) or die "Error opening the trivia file\n";


Das hat mehrere Vorteile: Es ist klar, für *was* die Datei geöffnet wird (lesen, schreibend); bringt mehr Sicherheit; es dürfen führende Leerzeichen im Dateinamen vorkommen;...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2007-09-07 10:04
#99177 #99177
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
for($i=0;$i<length($Question);$i+=1) {
      push(@letters,substr($Question,$i,1));
}


Besser:

Code (perl): (dl )
push @letters, split(//, $Question);



...


Code (perl): (dl )
1
2
3
for($i = 0; $i < $QNum; $i += 1) {
      $QuestionLine = <QFILE>;
}


vs.

Code (perl): (dl )
1
2
3
for(0..$QNum-1) {
      $QuestionLine = <QFILE>;
}


BTW: Was soll hier genau gemacht werden? die xte Zeile aus der Datei bekommen?

Dann würde ich eher CPAN:Tie::File verwenden


...


Code (perl): (dl )
1
2
3
for($i=0;$i<scalar(@letters);$i+=1) {
      $Question = $Question." ".$letters[$i];
}


vs.



Code (perl): (dl )
1
2
3
for my $elem (@letters) {
      $Question .= " ".$elem;
}


oder noch besser:

Code (perl): (dl )
 $Question .= " " . join( " ", @letters);
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Gast Gast
 2007-09-22 02:24
#99845 #99845
so ich bin wieder hier,
also ich habe immer noch das problem leute,
bekomme folgenden fehler:

Use of uninitialized value in substr at spicytrivia.pltr line 572.
Use of uninitialized value in split at spicytrivia.pltr line 574.
Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE ]/ at ..... line 575

dass sind eben oben beschriebene zeilen,
572:$d = substr($QuestionLine,0,1);

ich will eigentlih mit dem kod garnicht viel spielen, weiss der ist alt kann auch sein dass es schlecht programmiert ist, will eigentlich nur dass es fehlerlos funktioniert.


was ich haben will ist folgendes,
die funktion GetQuestion wird aufgerufen dann wird das file eingelesen dann der trenner ermittelt und dann die zeiel gsplittet, eine zeile sieht folgendermaßen aus:
|kategorie|antwort|frage
kann aber auch so aussehen falls mehrere antworten zur verfugung stehen.
|kategorie|antwort1||antwort2|frage

und dann sollte es eben zuruck gegeben werden in einzele variablen, das problem ist eben dass bei manchen fragen die obige fehlermeldung kommt.
renee
 2007-09-22 11:26
#99848 #99848
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kann es sein, dass es Leerzeilen in der Datei gibt??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-09-07 01:09.