Perl: lecture d'un repertoire et de fichiers

Fermé
tonguim Messages postés 47 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 27 février 2015 - 11 mai 2009 à 21:59
tonguim Messages postés 47 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 27 février 2015 - 12 mai 2009 à 22:00
Bonjour,

je voudrais écrire un programmer, qui lit plusieurs fichiers, terminés par l'extension ".txt", et stockés dans le même repertoire. Le programme doit lire chaque fichier, et chaque ligne et chercher la première valeur trouvée après le mot debut, et la première valeur trouvée après le mot fin et faire leur différence. Idem pour la ligne suivante, et pour les autres fichiers.
A la compilation, j'obtiens l'erreur suivante:

Unmatched ) in regex; marked by <-- HERE in m/) <-- HERE \S/ at lectureFichierPerl.pl line 18


#!/usr/bin/perl -w
#use strict;
use warnings;

use CGI::Carp qw(fatalsToBrowser);

my $dir = './Chemin/Fichier/';

# read all entries in the directory:
opendir DIR, $dir or die "Cannot open $dir $!";
my @listeFichiers = grep /\.txt$/, readdir DIR;
foreach $file (@listeFichiers) 
{
	open FILE, $file or die $!;
  print $file . "\n";
	while (my $line = <FILE>) # lire chaque ligne et chercher la première valeur trouvée après le mot debut, et la première valeur trouvée après le mot fin
	{
		$line1  =~ m{debut}/(\s*)\S*\s*\S*\s*\S*\s*\S*\s*(\S*/);

		$X1=$S1; $X4=$S4;
		$lenght1= $X1-$X2; # Calculation of the lenght of first segment

		$line1  =~ m{fin}/(\s*)\S*\s*\S*\s*\S*\s*\S*\s*(\S*/);
		$X1=$S11; $X4=$S14;
		$lenght2= $X1-$X2; # Calcul de la longueur du premier segment

	}
		push(@elements1, $lenght1); #Push la longueur dans un tableau pour calculer la moyenne de la longueur du segment n°1
		push(@elements2, $lenght2); #Push la longueur dans un tableau pour calculer la moyenne de la longueur du segment n°2
}

foreach (@elements1)
{
	    $sum1 += $_;
}

foreach (@elements2)
{
	    $sum2 += $_;
}

$moyLongSeg1=$sum1/2;
$moyLongSeg2=$sum2/2;
closedir DIR;
.

Merci.

Tous les fichiers ont le même contenu suivant:
champs1 (champs6 donnee_o donnee_f) [(champs2 [] (champs3 _YOJNJeyyyyyyB (champs4 donnee_x)) (debut 144825 25345) (fin 244102 40647)), (champs2 [] (champs3 _FuGNJeyyyyyyB (champs4 donnee_z)) (debut 796443 190570) (fin 145247 42663))] [] []).
A voir également:

1 réponse

tonguim Messages postés 47 Date d'inscription mercredi 7 septembre 2005 Statut Membre Dernière intervention 27 février 2015 1
12 mai 2009 à 22:00
Bonjour,

j'ai une erreur de division (division par 0); je pense que les variables @elements1 et @elements2 sont vides alors qu'elles sont censées obtenir leur contenu de la boucle [QUOTE]while ((($debut, $fin) = $result =~ /debut\s+([0-9]+).+?fin\s+([0-9]+)/g) and $i < 3)[/QUOTE]

#!/usr/bin/perl -w
use strict;
use warnings;
use diagnostics;
use CGI qw/:standard/; 
use CGI::Carp 'fatalsToBrowser';

our $dir = '/chemin/Fichiers/';
our $meanOfLenghts1;
our $meanOfLenghts2;
our $mimetype;
our $numberOfFilesListed;
our $sum2;
our $sum1;
our $file;
our $i;
our @elements;
our @elements1;
our @elements2;
our $fh,
our @length;
#our $length;
our @listeFichiersMem;
our $debut;
our $fin;
our $line;
our $result;
our $value;

my $cgi = CGI -> new();

# read all entries in the directory:
opendir DIR, $dir or die "Cannot open $dir $!";
@listeFichiersMem = grep /\.txt$/, readdir DIR;
closedir DIR;
#printf $cgi -> header("Content-type: $mimetype; charset=utf-8; Content-Disposition: attachment;");

foreach $file (@listeFichiersMem) 
{
		printf "Hallo test";
    $i = 1;
		$numberOfFilesListed++;
		open $fh, "<", $file or die $!;
	  print "$file" . "\n";

		while ($line = $fh) #read each line from FILE.
    {
          chomp ($line);
          while ((($debut, $fin) = $result =~ /debut\s+([0-9]+).+?fin\s+([0-9]+)/g) and $i < 3)
          {
                        $length[$i] = $fin - $debut; # Calculation of the lenght of the first segment, then the lenght of the second segment
                        #push(@elements[$i], $length[$i]); #Push the 2 computed lenghts into a table to compute the mean of lenght for the 2 segments
                        $elements[$i] -> push($length[$i]);
                        $i++;
          }
    }
		close $fh;
}

foreach $value (@elements1)
{
        $sum1 += $value;
				printf $sum1;
}

foreach $value (@elements2)
{
        $sum2 += $value;
}

$meanOfLenghts1 = $sum1/$numberOfFilesListed;
$meanOfLenghts2 = $sum2/$numberOfFilesListed;

printf ("%d %d", $meanOfLenghts1, $meanOfLenghts2);
0