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

Langage Perl Discussion :

Problème lecture fichier en redirection avec foreach


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Par défaut Problème lecture fichier en redirection avec foreach
    Bonjour,

    je vais vous expliquer brièvement ce que je cherche a faire:
    j'ai un dump des noeuds contenu dans une application, a chaque lancement du script, je voudrais qu'il vérifie si les noeuds qui étaient présent dans l'ancien dump le sont toujours ou si ils ont été supprimés. Mon problème vient du fait que mon fichier est en redirection (>>), ce qui pose grandement problème a ma boucle foreach apparemment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open (DUMP,">>/tmp/dump");
    foreach $node (<DUMP>) {
    print "$node";
    }
    Ce code ne m'affiche rien, or si je remplace par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (DUMP,"/tmp/dump");
    La aucun problème j'ai bien le contenu du tableau qui est affiché. Mon problème est que ce fichier DUMP est rempli a chaque itération du script avec une nouvelle entrée.

    Je vous met l'intégralité de mon script au cas ou vous me trouviez une solution détournée
    PS: en rouge les lignes dont il est question plus haut.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    #!/bin/perl
    
    ## Script argument waited:
    ## 1st argument: IP of NNM Server
    ## 2nd argument: Site name (ex C2x or C4)
    
    
    $NNM_IP=$ARGV[0];
    $site=$ARGV[1];
    
    open (LOG,">>/tmp/NNMImport.log");
    print LOG "$date";
    
    open (DUMP,">>/tmp/dump");
    
    # get NNM nodes
    @file=`opcdeploy -cmd "D:\\HP\\NNM\\nonOV\\perl\\a\\bin\\perl D:\\HP\\NNM\\bin\\nnmtopodump.ovpl -type node" -node $NNM_IP`;
    #get OM nodes
    @file2=`opcnode -list_nodes | grep Name | awk '{print\$3}'`;
    
    
    #define table for existing OM node
    foreach $node (@file2) {
    	$node_exist[$node]->{_exist}=1;
    }
    
    
    # parse NNM node results and insert nodes 
    foreach $line (@file){
    
    	if ($line =~ /<name>(.*)</) {
    	$node_name=$1;
    	print DUMP "$node_name\n";
    	}
    
    	if ($line =~ /<shortname>(.*)</) {
    	$node_label=$1;
    	}
    
    	if ($line =~ /<deviceCategory>(.*)</) {
    	$node_type=$1;
    		if ($node_type eq "Other"){
    			if (($systobjectID eq ".1.3.6.1.4.1.236.30.2.2")||($systobjectID eq "PELCO")){
    			$layout_group="$site Camera";
    			$node_group="$site Camera";
    			} 
    			else {
    			$layout_group="$site Other";
    			$node_group="$site Other";
    			}
    		}
    			
    		if ($node_type eq "Switch"){
    		$layout_group="$site Switch";
    		$node_group="$site Switch";
    		}
    
    		if ($node_type eq "Server"){
    		$layout_group="$site Server";
    		$node_group="$site Server";
    		}
    
    		if (($node_type eq "Computer")||($node_type eq "Workstation")){
    		$layout_group="$site Workstation";
    		$node_group="$site Workstation";
    		}
    
    		if ($node_type eq "Printer"){
    		$layout_group="$site Printer";
    		$node_group="$site Printer";
    		}
    	}
    
    	if ($line =~ /<systemObjectId>(.*)</) {
    	$systobjectID=$1;
    	}
    
    	
    	if ($line =~ /<\/node>/) {
    	# a new node iteration has been covered place it in OM node node bank
    	&insert_or_move_node();			
    	}
    }
    
    # now control if nodes have been suppresed from NNM and delete them from OM
    #to be implemented
    
    # Add node function
    sub add_node {
    print "\tadd node $node_name\n";
    	`opcnode -add_node node_name=$node_name node_label=$node_label net_type=NETWORK_IP mach_type=MACH_BBC_OTHER_IP group_name='$node_group' layout_group='$layout_group'`;
    	}
    
    	
    # Move node function
    sub move_node {
    	print "\tmove node $node_name\n";
    	`opcnode -move_nodes node_list='$node_name' layout_group='$layout_group'`;
    	`opcnode -deassign_nodes node_name='$node_name' group_name='$site Other' net_type=NETWORK_IP `;
    	`opcnode -assign_nodes node_name='$node_name' group_name='$node_group' net_type=NETWORK_IP `;
    }
    
    
    # Delete nodes
    sub delete_node {
    	foreach $node (<DUMP>) {
    print "$node";
    		$node_to_supress = print (grep {/'$node'/} @file);
    		if ($node_to_supress eq "") {
    			`opcnode -del_node node_name=$node net_type=NETWORK_IP`;
    		}
    	}
    }
    
    
    # insert or move node function
    #if node already exist move it in appropriate node group
    #else add it in OM nodebank
    sub insert_or_move_node {
    	print "insert or move node : $node_name\n";
    		if ($node_exist[$node]->{_exist}) {
    			&move_node ();
    		}
    		else {
    			&add_node ();
    		}
    	&delete_node ();
    }
    J'espère avoir bien expliqué mon problème, je vous remercie par avance de toute l'aide que vous pourrez m'apporter

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    Tu ouvres ton fichiers en écriture seule avec ajout (">>"). Tu ne peux donc pas le lire.

    Essaie en l'ouvrant en lecture/écriture avec ajout ("+<").

  3. #3
    Membre confirmé
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Par défaut
    Hummm ok, en effet ca fonctionne bien en effet
    Bon après j'ai vraiment fait ma nouille, parce que j'ai trouvé une autre solution peu de temps avant en faisant un close puis open en lecture juste avant l'appel de ma fonction delete.

    Malheureusement, le comportement n'est pas exactement celui attendu, mais la le problème vient plutôt du fait du grep j'en ai peur.
    Pour une raison que j'ignore, il me rajoute systématiquement un 1 ou un 0 devant mon hostname, ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $node_to_supress = print (grep {/'$node'/} @file);
    print "$node_to_supress";
    me renvoie le résultat:
    110.X.X.X au lieu de 10.X.X.X.

    J'ai l'impression qu'il m'ajoute le code retour de la fonction au passage...

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 184
    Par défaut
    Pourquoi print ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Architecte Supervision
    Inscrit en
    Juillet 2005
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte Supervision
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2005
    Messages : 84
    Par défaut
    Hello,

    oui non pas de raison, c'est un reliquat de plusieurs tests que j'ai fait auparavant. toujours est il que ce code me renvoie la valeur 0 pour la variable $node_to_supress et que je n'arrive pas bien a comprendre pourquoi, car parfois elle prend la valeur 1, j'arrive pas bien a voir la logique dans tout ca, mais bon je vais continuer a investiguer

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Peux tu nous remettre ton dernier code complet à ce jour.
    Sinon en regardant rapidement ton premier post, voici déjà des corrections impératives.
    1. Met toujours en début de script ceci
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      use strict;
      use warnings;
    2. Pense à bien déclarer tes variables
    3. Essaye d'indenter correctement ton code
    4. Voici un peu de lecture.

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

Discussions similaires

  1. Problème lecture fichier avec fscanf
    Par hypto dans le forum C
    Réponses: 7
    Dernier message: 18/11/2013, 16h57
  2. problème lecture fichier avec structures de données
    Par hannibal007 dans le forum Débuter
    Réponses: 3
    Dernier message: 09/04/2013, 19h51
  3. Problème lecture fichier DBF avec mémos
    Par Fishes83 dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 20/02/2013, 14h49
  4. Réponses: 2
    Dernier message: 23/06/2009, 08h42
  5. Problème lecture fichier avec >>
    Par C1rcus dans le forum C++
    Réponses: 2
    Dernier message: 18/11/2007, 18h19

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