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

Sebastien Moretti sebastien.moretti at unil.ch
Mer 23 Mar 10:50:52 CET 2016


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



Plus d'informations sur la liste de diffusion Perl