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

Philippe Delavalade philippe.delavalade at orange.fr
Mer 23 Mar 11:19:00 CET 2016


Le mercredi 23 mars à 11:06, Stéphane Gigandet a écrit :
> Bonjour,
> 
> Quand tu ouvres le 2ème fichier, tu lis tout le fichier au lieu d'une ligne
> à cause du $/ = undef du 1er fichier.

OK. Je croyais bêtement que le $/=undef ne concernait que le premier fichier.

Merci beaucoup.

-- 
Ph. Delavalade

> 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
> >
> 
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl


Plus d'informations sur la liste de diffusion Perl