IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation et administration système Perl Discussion :

Use of uninitialized value in string


Sujet :

Programmation et administration système Perl

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut Use of uninitialized value in string
    Bonjour à tous,

    Je me suis lancé récemment dans le perl.
    J'utilise le module Spreadsheet pour insérer des données dans un fichier excel.
    Jusque la tout va bien.

    J'ai ma boucle d’insertion, et en fait, en fonction du numéro de ligne, si il existe dans ma liste, je lui affecte un format, sinon un autre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #Variables du script
    no strict 'vars';
    for $le ("a".."l", "deb", "fin", "ligne", "chiffre", "args") {
    	${"$le"} = 0;
    }
    $h = 4;
    $i = 1;
    $ligne = 3;
    $args = @ARGV;
    my @prems = ();
    my @separe = ();
     
    #Je remplis ma colonne, et au passage mon tableau separe
    for $g (0..$#alpha) {
    	if (${"let_$g"} gt 1) {
    		$deb = $h + ${"pre_$g"};
    		$fin = $deb + ${"let_$g"} - 1;
    		$worksheet -> merge_range("B$deb:B$fin", "$alpha[$g]", $merge);
    		$separe[$i] = $fin;
    		$i++;
    	} elsif (${"let_$g"} eq 1) {
    		$deb = $h + ${"pre_$g"} - 1;
    		$fin = $deb;
    		$worksheet -> write("$deb", 1, "$alpha[$g]", $gauche);
    		$separe[$i] = $fin;
    		$i++;
    	}
    }
    print "voici la liste : @separe";

    Jusque la OK, j'affiche mon tableau il est bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    voici la liste : 3 32 44 74 90 100 152 158 161 161 180 186 206 251 256 261 287 294 307 318 325 325 326 331 331
    Mais ensuite lors du test dans une boucle plus lointaine (le test de verif si mon argument est dans le tableau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for ($j=1,$ligne=3;$j<$args;$j++,$ligne++) {
    ...
    	if (grep {$_ eq "$ligne"} @separe) {
    		$donnees = $separation;
    		$coin = $angle;
    	} else {
    		$donnees = $data;
    		$coin = $droite;
    	}
    ...
    }
    J'ai cette erreur environ 300 fois (nombres de lignes excel)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Use of uninitialized value in string eq at /usr/syno/perl/contacts.pl line 284. (if (grep {$_ eq "$ligne"} @separe) {)
    Je me doute que c'est tout bête, un truc du style "my" mais je ne trouve pas.

    D'autant que si avant mon dernier for je declare ma liste comme ceci ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @separe = (3,32,44,74,90,100,152,158,161,161,180,186,206,251,256,261,287,294,307,318,325,325,326,331,331);
    Merci pour votre aide

  2. #2
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Salut,

    Cela est causé par une valeur nulle lors de ton test via grep.
    ici donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (grep {$_ eq "$ligne"} @separe)
    si tu veux tester le contenu du tableau perso moi je le fait via la création d'une table de hash puis un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(exists($Href{value}))
    .

    Ensuite oui, les déclarer avec un "my" ne ferait pas de mal en effet .. .
    Cdlt.

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Merci pour ta réponse,

    Effectivement en déclarant comme tu dis plus d'erreur, par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    for $g (0..$#alpha) {
    	if (${"let_$g"} gt 1) {
    		$deb = $h + ${"pre_$g"};
    		$fin = $deb + ${"let_$g"} - 1;
    		$worksheet -> merge_range("B$deb:B$fin", "$alpha[$g]", $merge);
    		$separe{$i} = $fin;
    		$i++;
    	} elsif (${"let_$g"} eq 1) {
    		$deb = $h + ${"pre_$g"} - 1;
    		$fin = $deb;
    		$worksheet -> write("$deb", 1, "$alpha[$g]", $gauche);
    		$separe{$i} = $fin + 1;
    		$i++;
    	}
    }
     
    ...
     
    	if (exists($separe{$ligne})) {
    		$donnees = $separation;
    		$coin = $angle;
    	} else {
    		$donnees = $data;
    		$coin = $droite;
    	}
    Ca ne fonctionne plus comme je veux. En fait, dans la boucle de 1 à 300, il dit que la condition est vrai pour les 26 premiers soit le nombre d'élément du hash, comme si il mettait tout vrai au début et ensuite tout faux au lieu de "répartir"...

  4. #4
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Ben c'est a dire que oui la c'est normal , j'aurais plutot vu un truc du genre:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach my $ligne(@TonTableau){
        if (exists($separe{$ligne})) {
    	$donnees = $separation;
    	$coin = $angle;
        } else {
    	$donnees = $data;
    	$coin = $droite;
        }
    }
    Du coup tu testes chaque élément du tableau avec ton hash et donc tu auras bien tes 300 arguments (si j'ai bien compris ce que tu veux faire).

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Je ne comprend pas très bien, en fait ma boucle à la base elle est sur mes arguments :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    #Remplissage du fichier
    for ($j=1,$ligne=3;$j<$args;$j++,$ligne++) {
    	$ARGV[$j] =~ s/#/ /g;
    	$ARGV[$j+1] =~ s/#/ /g;
    	$ARGV[$j+2] =~ s/#/ /g;
    	$ARGV[$j+3] =~ s/#/ /g;
    	$ARGV[$j+4] =~ s/#/ /g;
    	$ARGV[$j+5] =~ s/#/ /g;
    	$ARGV[$j+6] =~ s/#/ /g;
    	if (exists($separe{$ligne})) {
    		$donnees = $separation;
    		$coin = $angle;
    	} else {
    		$donnees = $data;
    		$coin = $droite;
    	}
    	$worksheet -> write($ligne, 2, "$ARGV[$j]", $donnees);
    	$worksheet -> write($ligne, 3, "$ARGV[$j+1]", $donnees);
    	$worksheet -> write($ligne, 4, "$ARGV[$j+2]", $donnees);
    	$worksheet -> write($ligne, 5, "$ARGV[$j+3]", $donnees);
    	$worksheet -> write($ligne, 6, "$ARGV[$j+4]", $donnees);
    	$worksheet -> write($ligne, 7, "$ARGV[$j+5]", $donnees);
    	$worksheet -> write($ligne, 8, "$ARGV[$j+6]", $coin);
    	$j = $j + 6;
    }

  6. #6
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Je suis pas sur de saisir ce que tu veux faire mais pourquoi par exemple ne pas faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #Remplissage du fichier
    foreach my $ligne ( @Tableau){
     
           if ($ligne =~ /#/){  $ligne =~ s/#//g;}
    	if (exists($separe{$ligne})) {
    		$donnees = $separation;
    		$coin = $angle;
    	} else {
    		$donnees = $data;
    		$coin = $droite;
    	}
    }
    Aprés je vois pas trop ou tu veux en venir avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    	$worksheet -> write($ligne, 2, "$ARGV[$j]", $donnees);
    	$worksheet -> write($ligne, 3, "$ARGV[$j+1]", $donnees);
    	$worksheet -> write($ligne, 4, "$ARGV[$j+2]", $donnees);
    	$worksheet -> write($ligne, 5, "$ARGV[$j+3]", $donnees);
    	$worksheet -> write($ligne, 6, "$ARGV[$j+4]", $donnees);
    	$worksheet -> write($ligne, 7, "$ARGV[$j+5]", $donnees);
    	$worksheet -> write($ligne, 8, "$ARGV[$j+6]", $coin);
    	$j = $j + 6;
    }

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Ben en fait, je passe en argument du script toutes les cases du tableau excel ($args[$j]). Les espaces que je veux renseigner sont en fait des # pour pouvoir être pris comme un seul argument ($ARGV[$j] =~ s/#/ /g donc je remet mon espace d'origine.
    Je veux parcourir tous mes arguments, avec leurs numéros de lignes ($ligne), si le numéro de ligne est dans le tableau separe, je dois lui appliquer un format spécial, sinon un normal. Tu vois mieux ?

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    Tu vois ce que je fais alors ? Comment puis intégrér ton code dans ma boucle ?
    Je suis débutant désolé

  9. #9
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Salut, désolé étant au boulot je n'ai pu répondre avant.

    Alors j'ai encore besoin d'éclaircissement et pour cela est-ce que tu peux me montrer ta ligne de commande lors du lancement du script afin de voir ton passage d'argument.

    En fait j'espere me tromper mais passes-tu tes "cases" excel une a une ??

  10. #10
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 258
    Points : 77
    Points
    77
    Par défaut
    J'ai trouvé entre temps.
    Le problème venait du fait que dans cette boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #Merge des cellules de lettres
    for $g (0..$#alpha) {
    	if (${"let_$g"} gt 1) {
    		$deb = $h + ${"pre_$g"};
    		$fin = $deb + ${"let_$g"} - 1;
    		$worksheet -> merge_range("B$deb:B$fin", "$alpha[$g]", $merge);
    		$separe[$i] = $fin;
    		$i++;
    	} elsif (${"let_$g"} eq 1) {
    		$deb = $h + ${"pre_$g"} - 1;
    		$fin = $deb;
    		$worksheet -> write("$deb", 1, "$alpha[$g]", $gauche);
    		$separe[$i] = $fin + 1;
    		$i++;
    	}
    }
    Je faisais démarrer $i à 1. De ce fait, le $separe[0] était null

    Merci à toi en tout cas !!

  11. #11
    Membre éclairé Avatar de messinese
    Homme Profil pro
    IT Security Consultant
    Inscrit en
    Septembre 2007
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IT Security Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 429
    Points : 876
    Points
    876
    Par défaut
    Ben de rien pour le coup ça servira peut etre à d'autre.

    tag résolu ?

    Cdlt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Use of uninitialized value $valhier in string at
    Par mikael2235 dans le forum Langage
    Réponses: 17
    Dernier message: 19/03/2012, 09h20
  2. Use of uninitialized value in concatenation (.) or string
    Par pontarose dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2011, 13h26
  3. Use of uninitialized value $code_retour in string ne at
    Par cbassti1 dans le forum Langage
    Réponses: 1
    Dernier message: 24/01/2010, 22h16
  4. Use of uninitialized value in string ne at
    Par Gad29 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 09/05/2007, 13h49
  5. [langage] Use of uninitialized value
    Par Batou dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2005, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo