[perl] est ce correct ??

est ce correct ?? [perl] - Perl - Programmation

Marsh Posté le 30-04-2004 à 12:44:36    

salut,
 
alors je vous explique mon pb
 
j ai 2 fichiers, file1 et file2 qui contiennent chacun des numeros (numeros de 10 chiffres/ligne)
j aimerai connaitre les numeros qui sont dans file1 ET PAS dans files2 :D
 
j ai fait ca :
 

Code :
  1. #! /usr/bin/perl
  2. open(ESU, 'list_esu') || die "impossible";
  3. open(TRM, 'list_trm') || die "impossible";
  4. while ($line = <ESU> )
  5. {
  6.     $res = grep $line, <TRM>;
  7.     if ($res)
  8.     {
  9.         print $line;
  10.     }
  11. }


 
mais je ne suis pas tres sur du resultat ue ca sort (en l occurence 1 seul numero sachant que les fichier font 3 et 10Mo :D)
 
 
voilou


---------------
:: Light is Right ::
Reply

Marsh Posté le 30-04-2004 à 12:44:36   

Reply

Marsh Posté le 30-04-2004 à 14:43:03    

ton grep va lire tout le fichier la premiere fois qu'il va être appelé, et ensuite il ne sortira plus rien puisqu'il aura atteind al fin du fichier.
 
il te faut faire:

Code :
  1. #! /usr/bin/perl
  2.   use strict;
  3.   open(ESU, 'list_esu') || die "impossible";
  4.   open(TRM, 'list_trm') || die "impossible";
  5.  
  6.   my %existe_TRM = map {$_ => 1} <TRM>;
  7.   while ($line = <ESU> ) {
  8.         if (not exists $existe_TRM{$line}) {
  9.               # pas dans ce fichier
  10.               print $line;
  11.         }
  12.   }


 
 
ou alors:
 

Code :
  1. open...
  2. my $TRM = join("|", <TRM> );
  3. print grep {!/$TRM/o} <ESU>;


(non testé...)

Reply

Marsh Posté le 30-04-2004 à 14:44:04    

je teste merci ;)


---------------
:: Light is Right ::
Reply

Marsh Posté le 30-04-2004 à 14:59:19    

pospos a écrit :

ton grep va lire tout le fichier la premiere fois qu'il va être appelé, et ensuite il ne sortira plus rien puisqu'il aura atteind al fin du fichier.
 
il te faut faire:

Code :
  1. #! /usr/bin/perl
  2.   use strict;
  3.   open(ESU, 'list_esu') || die "impossible";
  4.   open(TRM, 'list_trm') || die "impossible";
  5.  
  6.   my %existe_TRM = map {$_ => 1} <TRM>;
  7.   while ($line = <ESU> ) {
  8.         if (not exists $existe_TRM{$line}) {
  9.               # pas dans ce fichier
  10.               print $line;
  11.         }
  12.   }


 
 
ou alors:
 

Code :
  1. open...
  2. my $TRM = join("|", <TRM> );
  3. print grep {!/$TRM/o} <ESU>;


(non testé...)


 
 

tomate@gate:~/taf$ ./test.pl
Global symbol "$line" requires explicit package name at ./test.pl line 9.
Global symbol "$line" requires explicit package name at ./test.pl line 11.
Global symbol "$line" requires explicit package name at ./test.pl line 13.
Execution of ./test.pl aborted due to compilation errors.


 
:/


---------------
:: Light is Right ::
Reply

Marsh Posté le 30-04-2004 à 15:01:24    

bon ct a cause du use strict ;)
mais ca me sort tous les numeros :/


---------------
:: Light is Right ::
Reply

Marsh Posté le 30-04-2004 à 15:16:00    

Code :
  1. tomate@gate:~/taf$ ./test.pl
  2. Global symbol "$line" requires explicit package name at ./test.pl line 9.
  3. Global symbol "$line" requires explicit package name at ./test.pl line 11.
  4. Global symbol "$line" requires explicit package name at ./test.pl line 13.
  5. Execution of ./test.pl aborted due to compilation errors.


c'est pas a cause du "use strict" c'est à cause du "je code comme un cochon je déclare pas mes variables"
et si ça sort tout c'est peut-être que les deux fichiers ont été inversés...


Message édité par anapajari le 30-04-2004 à 15:16:24
Reply

Marsh Posté le 30-04-2004 à 15:24:42    

anapajari a écrit :

Code :
  1. tomate@gate:~/taf$ ./test.pl
  2. Global symbol "$line" requires explicit package name at ./test.pl line 9.
  3. Global symbol "$line" requires explicit package name at ./test.pl line 11.
  4. Global symbol "$line" requires explicit package name at ./test.pl line 13.
  5. Execution of ./test.pl aborted due to compilation errors.


c'est pas a cause du "use strict" c'est à cause du "je code comme un cochon je déclare pas mes variables"
et si ça sort tout c'est peut-être que les deux fichiers ont été inversés...


nan mais c est pas grave je vais le faire a la porc en shell :D
 
c est un truc qui sera lancé une seule fois donc si ca prend 10h je m en fou :D
 
merci kan meme en tout cas ;)


---------------
:: Light is Right ::
Reply

Marsh Posté le 01-05-2004 à 18:22:32    

!/usr/bin/perl -w
 
use strict;
 
my ($f1, $f2) = @ARGV;
my %ref;
 
unless ($#ARGV == 1 && $f1 && $f2) {
        print STDERR "Usage: pl <f1> <f2>\n";
        exit 1;
}
 
open(FILE, $f2) or die "Cannot open file $f2: $!";
map { $ref{$_} = 1 } <FILE>;
close(FILE);
 
open(FILE, $f1) or die "Cannot open file $f1: $!";
map { print unless $ref{$_} } <FILE>;
close(FILE);

Reply

Marsh Posté le 01-05-2004 à 19:46:20    

ca marche pas :/ (ca sort tous les numeros)


Message édité par Tomate le 01-05-2004 à 19:49:10

---------------
:: Light is Right ::
Reply

Marsh Posté le 01-05-2004 à 22:53:55    

/home/nicolas/tmp% cat f1
1978
1976
1950
1951
/home/nicolas/tmp% cat f2
1976
1978
/home/nicolas/tmp% ./pl f1 f2
1950
1951


C'est pas ce que tu veux ?


Message édité par matafan le 01-05-2004 à 22:54:20
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed