[PERL] un if tout bête qui fonctionne pas !?

[Résolu/Fermé]
Signaler
Messages postés
6
Date d'inscription
mardi 8 janvier 2008
Statut
Membre
Dernière intervention
11 janvier 2008
-
Messages postés
6
Date d'inscription
mardi 8 janvier 2008
Statut
Membre
Dernière intervention
11 janvier 2008
-
Bonjour !

Venant du monde des scripts shell, j'ai fini par passer récemment sous PERL qui semble tellement plus adapté au boulot que je fais (extraction/construction de fichiers textes).

Sauf que là je comprends pas un truc. Mais vraiment pas. C'est vraiment bizarre. Auriez vous la réponse ?

Cf mon code en entier en fin de post.

Ce sont les dernières lignes qui ne fonctionnent pas, en l'occurrence celles-ci :
 if ($ligne[$i] =~ /%block AtomicCoordinatesAndAtomicSpecies/) {
                foreach $j (1..$NumberOfAtoms) {
                        ($position) = ($ligne[$i+$j] =~ /( +.\d+.\d+ +.\d+.\d+ +.\d+.\d+) +[12]/);
                        ($attype) = ($ligne[$i+$j] =~ / +([12])/);
                        if ($attype = 1) {
                                print $at1;
                        }
                        if ($attype = 2) {
                                print $at2;
                        }
                        print "\t$position\n";
                }
        }



Au lieu de m'imprimer un truc du style :

Fe           0.04     0.34   0.324


ou selon la valeur de $attype

Cr            0.04     0.34   0.324


Il print un :

FeCr          0.04     0.34   0.324



Merci déjà de m'avoir lu jusque là !!!


Le code en entier:


#!/usr/bin/perl
use warnings;

open(FDF,'mix.fdf');
@ligne=<FDF>;           # chaque ligne du fichier source est assignee a une ligne dun @

foreach $i (0..@ligne) {

        if ($ligne[$i] =~ /NumberOfAtoms/) {
                ($NumberOfAtoms) = ($ligne[$i] =~ /^NumberOfAtoms *([0-9]+)/);
        }

        if ($ligne[$i] =~ /NumberOfSpecies/) {
                ($NumberOfSpecies) = ($ligne[$i] =~ /^NumberOfSpecies *([0-9]+)/);
        }

        if ($ligne[$i] =~ /%block ChemicalSpeciesLabel/) {
                ($at1) = ($ligne[$i+1] =~ /1 +[0-9]+ +([A-Za-z]+)/);
                ($at2) = ($ligne[$i+2] =~ /2 +[0-9]+ +([A-Za-z]+)/);
                print "$NumberOfAtoms\n$NumberOfAtoms atomes, de type $at2 et $at1\n";
        }


        if ($ligne[$i] =~ /%block AtomicCoordinatesAndAtomicSpecies/) {
                foreach $j (1..$NumberOfAtoms) {
                        ($position) = ($ligne[$i+$j] =~ /( +.\d+.\d+ +.\d+.\d+ +.\d+.\d+) +[12]/);
                        ($attype) = ($ligne[$i+$j] =~ / +([12])/);
                        if ($attype = 1) {
                                print $at1;
                        }
                        if ($attype = 2) {
                                print $at2;
                        }
                        print "\t$position\n";
                }
        }
}

2 réponses

Bonsoir

Je ne connais pas le PERL, mais ce ne serait pas (comme en C, java, javascript, PHP et sûrement d'autres)
if ($attype == 1) et
if ($attype == 2)

le = étant l'affectation et le == la comparaison ?
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 545
Salut,

oui, c'est bien ça ;-)
>
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019

Je pourrai donc rajouter le PERL à ma liste la prochaine fois que l'erreur se représentera, ce qui ne devrait pas tarder. Difficile de faire plus classique ! ;-)
Messages postés
6
Date d'inscription
mardi 8 janvier 2008
Statut
Membre
Dernière intervention
11 janvier 2008
2
ohhhhh quel idiot je suis !!!! :))

Merci beaucoup tous les trois :)