Toon posts:

[Perl] verschil tussen 5.003 en 5.8

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit met een probleempje. Ik heb een ingewikkeld script wat perfect draait op een linux machine met perl 5.003. Nou moet het gaan draaien op een machine met perl 5.8 en dat werkt dus niet.

Ik krijg geen fouten tijdens het compileren of iets dergelijks, maar het werkt gewoon niet goed. Het gaat fout tijdens het inlezen van een bestand, hij roept dingen die onzin zijn.

Nou mijn vraag, wat kan ik het beste doen? Zijn er grote verschillen tussen die twee versies waardoor ik het script handmatig kan 'omzetten'? Of kan ik het beste twee perl versies langs elkaar gaan draaien? (wat volgens mij best lastig is op linux) Of is er nog een andere oplossing?

Tis niet zomaar een simpel scriptje maar een script van 3000 regels ofzo. Dus 'even' hier de source neerzetten gaat niet.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Er zijn geen grote verschillen; het zou niet zoveel moeite hoeven kosten om het script op Perl 5.8 te laten draaien.

Zonder meer informatie over wat er precies mis gaat, kunnen wij je natuurlijk niet met je specifieke probleem helpen.

Verwijderd

Geef eens de foutmeldingen die je krijgt ofzow...

Verwijderd

Topicstarter
Verwijderd schreef op 13 mei 2004 @ 15:51:
Geef eens de foutmeldingen die je krijgt ofzow...
ok... Ik zal een stukje geven wat al 'raar' is :)

Het script leest een configuratiebestand in waar allemaal opties enzo in staan. Ook staat er commentaar in met dat met # is uitgecommentaard. Het probleem dat optreed is dat het script zegt dat er een # staat en dat is niet het geval.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub Decode_Config_File
{
  my $file = shift;
  my ($line, $section);
  my $linenum = 0;
  my $info;
  my @list;
  open (FILE, "$file") || die "Can\'t open config file \"$file\". Abort.\n";
  while (defined ($line = <FILE>)) { 
    $linenum++;
    last if eof (FILE);
    ($info, $linenum, $line) = &read_conf ($linenum, $line, \*FILE);
    die "Error in $file line $linenum: must be 'section' instead of '$info'\n"
      unless ($info eq 'section');


Hij stopt hier dus bij die 'die' met de melding dat er een # staat in regel 9. Maar daar staat dus echt 'section'. De functie read_conf is als volgt:

code:
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
sub read_conf
{
  my ($linenum, $line, $file) = @_;
  *FILE = *$file;
        
  $line =~ s,^\s+,,o;            # remove useless blanks
  $line =~ s,^(\#|//).*$,,o;     # remove comments (at the beginning)
  while (($line =~ m/^$/o || $line =~ m/^\"[^\"]*$/o) && !(eof (FILE))) {
    $line .= <FILE>;             # read one line
    $linenum++;
    $line =~ s,^\s*,,om;         # remove useless blanks
    $line =~ s,^(\#|//).*$,,om;  # remove comments (at the beginning)
  }
  $line =~ s/^(                  # at the beginning
               [{};]             # match '{', '}', or ';'
              |                  # OR
               \"                # a double quoted string
                (?:\\.|[^\"\\])*
               \"
              |                  # OR
               [^{};\"\s]+       # a word
             )\s*//mox;
  my $info = $1; 
  if (defined $info && $info) {
    chomp $info;
  }
  else {
    warn "Syntax error in conf file line $linenum.\n";
  }
  return ($info, $linenum, $line);
}


Dit is dus een stukje wat niet werkt. Nogmaals, het werkt allemaal wel met perl 5.003 maar niet met perl 5.8.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Hoe ziet je configuratiebestand er dan uit?

Verwijderd

Topicstarter
Soultaker schreef op 13 mei 2004 @ 16:33:
Hoe ziet je configuratiebestand er dan uit?
Ehmz, eerste paar regels waar het dus al foutloopt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
#########################################################
# Configuration file for dnewsreport .
#
# (c) 1998 by Curt Cranfield <curt@vphos.net>
# version 1.03
##########################################################

#Default parameters
section default {
## =()< libpath         "@<_PATH_NEWSLIB>@";>()=
        libpath         "/tmp/dnewsreport103/";
        module          "dnewsreport_103";  # ${libpath}/${module}.pm

Hij zegt dus dat het foutgaat in regel 9, waar dus duidelijk 'section default {' staat. Als ik wat regels weghaal ofzo dan krijg ik dezelfde error, maar dan in een ander regelnummer waar dus wel gewoon 'section default' staat.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 25-05 20:56
Hmz, als ik je test reconstrueer met Perl 5.6.1 gaat 'ie mist op regel 11:
Error in test.txt line 11: must be 'section' instead of 'libpath'
Ik vermoed dat er iets mis gaat met die reguliere expressies. Het steekt ook wel erg obscuur in elkaar; niet echt netjes dat zowel binnen als buiten die functie read_conf regels gelezen worden en lines bijgewerkt worden.

edit:
Ook met Perl 5.8.3 gaat 'ie mis op die regel 11 in het configuratiebestand. Misschien was de code voor Decode_Config_File niet compleet (ik heb zelf een accolade op het eind toegevoegd), of heb je tussendoor iets veranderd?

[ Voor 31% gewijzigd door Soultaker op 13-05-2004 17:36 ]


  • Juup
  • Registratie: Februari 2000
  • Niet online
Wat een smerige code. Je gaat in die sub ook nog met de filehandle zitten rommelen. Als je dat gewoon even herschrijft dan los je 2 problemen tegelijk op:
1. Je vervangt smerige code doo iets fatsoenlijks
2. Je lost je 5.8 probleem op.

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.

Pagina: 1