[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