[Perl] Erreur avec « exists » à moins que...

Stéphane Gigandet biz at joueb.com
Mer 23 Mar 11:06:50 CET 2016


Bonjour,

Quand tu ouvres le 2ème fichier, tu lis tout le fichier au lieu d'une 
ligne à cause du $/ = undef du 1er fichier.
Et comme tu Sébastien il manque le $i++ dans la boucle de fin.

Ci-dessous le script corrigé. Avec des print en plus pour voir ce qui se 
passe.

Bonne journée,

Stéphane


#!/usr/bin/perl -w

use Modern::Perl;

use strict;

my $src;
my @t1;
my @t2;
my %lst;

open( $src, "<", "$ARGV[0]" ) || die;
$/ = undef;
my $t = <$src>;
chomp($t);
@t1=split(/\n/,$t);
close $src;

$/ = "\n";

open( $src, "<", "$ARGV[0]") || die;
while (my $l = <$src>) {
   chomp($l);
   print "!--> $l <--\n";
   $lst{$l}=1;
}
close $src;

my $i=0;
while (defined($t1[$i]) ) {
   print "--> $t1[$i] <--\n";
   push(@t2,$t1[$i]);
   (exists $lst{$t2[$#t2]}) || die "$t2[$#t2] introuvable dans $ARGV[0]";
    $i++;
}

exit 0;




Le 23/03/2016 10:50, Sebastien Moretti a écrit :
> Bonjour,
>
> dans un cas comme celui-ci tu pourrais utiliser List::Compare qui 
> permet d'avoir l'intersection, l'union, ... entre deux listes.
>
> Ça aurait l'avantage de permettre d'avoir des lignes dupliquées dans 
> les fichiers ce que ta variable associative ne permet pas.
>
>
> Sinon il ne manque pas un $i++ quelque part dans ta boucle while finale?
>
>> Bonjour.
>>
>> Je donne ci-dessous une « simplification simpliste » d'un problème 
>> que je
>> rencontre avec un script plus long et compliqué.
>>
>> Je charge les lignes d'un premier fichier dans un tableau ; puis je 
>> fais un
>> peu pareil avec un autre fichier dont je charge les lignes dans une
>> variable associative. Je veux ensuite savoir si des lignes du premier
>> fichier sont déjà dans le second mais j'ai toujours une réponse négative
>> même avec l'exemple ci-joint dans lequel les deux fichiers sont 
>> identiques.
>>
>> La méthode peut sembler très compliquée dans l'exemple minimal ci-joint
>> mais ça ne semble pas idiot dans mon cas réel et j'ai construit cet
>> exemple en restant au plus près du script initial.
>>
>> Si quelqu'un pouvait me montrer mon erreur, je lui en serais très
>> reconnaissant.
>>
>> ----------------------------------------
>> #!/usr/bin/perl -w
>>
>> use Modern::Perl;
>>
>> my $src;
>> my @t1;
>> my @t2;
>> my %lst;
>>
>> open( $src, "<", "$ARGV[0]" ) || die;
>> $/ = undef;
>> my $t = <$src>;
>> chomp($t);
>> @t1=split(/\n/,$t);
>> close $src;
>>
>> open( $src, "<", "$ARGV[0]") || die;
>> while (my $l = <$src>) {
>>    chomp($l);
>>    $lst{$l}=1;
>> }
>> close $src;
>>
>> my $i=0;
>> while (defined($t1[$i]) ) {
>>    push(@t2,$t1[$i]);
>>    (exists $lst{$t2[$#t2]}) || die "$t2[$#t2] introuvable dans 
>> $ARGV[0]";
>> }
>>
>> exit 0;
>> ----------------------------------------
>>
>> Merci d'avance
>
> -- 
> Sébastien Moretti
>
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
>



Plus d'informations sur la liste de diffusion Perl