[Perl] Erreur avec « exists » à moins que...
Sylvain Lhullier
sylvain at lhullier.org
Mer 23 Mar 11:35:10 CET 2016
Pour localiser les modifications :
{
local $/=undef;
...
}
# Ici $/ revient à sa valeur initale
Philippe Delavalade a écrit :
> 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
> _______________________________________________
> Perl mailing list
> Perl at mongueurs.net
> http://listes.mongueurs.net/mailman/listinfo/perl
--
Sylvain Lhullier
Plus d'informations sur la liste de diffusion Perl