Transformer code shell en perl [Perl] - Perl - Programmation
Marsh Posté le 22-06-2005 à 16:01:55
Pour t'aider, tu peux trouver la documentation intégrale de PERL ici :
http://www.perl.org
Et tu peux trouver des tutoriels & FAQ ici :
http://www.developpez.net
Sinon, pour ton problème, je vais essayer de te montrer comment faire avec du code sur-commenté.
N'hésite pas à demander si tu ne comprends pas :
Code :
|
Marsh Posté le 22-06-2005 à 16:06:36
Merci beaucoup, je vais essayer de traduire la suite de mon code à partir de ca.
Marsh Posté le 22-06-2005 à 16:10:39
par contre plutot que le dictionnaire il est pas possible d'utiliser un classique tableau??
Marsh Posté le 22-06-2005 à 16:11:04
thurfin a écrit : Bonjour, |
Je fais du Perl mais j'ai déjà fais du shell mais ça remonte un peu...
Si j'ai bien compris la boucle while, elle s'occupe de parcourir les lignes d'un fichier et de spliter chaque ligne avec le caractère ":" pour pouvoir récupérer les valeurs : ip, name, type, community. Ensuite on les stocke dans des tableaux (si jme trompe pas sur l'interprétation du shell).
Voilà ce que je suggere:
Code :
|
Jsais pas si ça va t'aider mais bon...
Marsh Posté le 22-06-2005 à 16:17:28
concernant le script de elmoricq j'essaye de le faire avec des tableau plutot, ca m'est plus familier comme structure et ca sera plus simple pour la suite. J'aurai besoin de savoir si je peu incrémenter un compteur à la fin de la section "foreach my $line ..." ?
Marsh Posté le 22-06-2005 à 16:18:34
thurfin a écrit : par contre plutot que le dictionnaire il est pas possible d'utiliser un classique tableau?? |
Si.
Sauf que tu vas devoir utiliser 4 tableaux (un pour les IP, les noms, les types et les communities).
Avec comme seul point commun leurs indices.
Je trouve qu'un hachage est plus adapté au besoin que tu as exposé ici, mais l'un des aspects réputés du PERL est qu'on peut faire une chose de plusieurs manières différentes.
Avec des tableaux :
Code :
|
Marsh Posté le 22-06-2005 à 16:24:03
ok merci
Marsh Posté le 22-06-2005 à 16:31:32
Code :
|
je dois bien lire $i et non $1 ?
Marsh Posté le 22-06-2005 à 16:35:23
non en fait c bien $1 mais bon message d'erreur il veut que je face un paquage.
Marsh Posté le 22-06-2005 à 16:43:26
Bon ben ca marche (enfin j'ai pas d'erreur de syntaxe); merci pour tout.
Marsh Posté le 27-06-2005 à 13:30:17
j'ai avancé, j'ai fait l'essentiel il me manque plus que la partie relative au module snmp mais j'ai encore des erreurs que j'arrive pas à corriger.
Code :
|
message d'erreur :
Citation : |
Marsh Posté le 27-06-2005 à 13:39:26
Indentation de psychopathe, normal que tu aies du mal à t'y retrouver.
Essaie, même pour des tests, d'écrire du code proprement indenté, ça te fait gagner énormément de temps au final.
Sur ton script, "perl -c" me retourne :
Scalar found where operator expected at test.pl line 93, at end of line |
En fait, le problème vient avant la ligne 85, elle vient de la ligne 79 :
Code :
|
Il faut s'avoir que '\', en PERL (comme dans beaucoup de choses d'ailleurs), est un caractère d'échappement : le caractère suivant '\' est interprété comme un caractère de contrôle.
Ca te permet par exemple d'insérer des guillemets (car. " ) entre des guillemets :
Code :
|
Or donc, si on en revient à notre ligne 79, en PERL ça se traduit ainsi : "définition de la variable $ifs, chaîne de caractères contenant "; (+ tout ce qui suit après, jusqu'à trouver le guillemet fermant !).
Pour pouvoir écrire un '\', il faut "l'échapper" avec... le caractère d'échappement : \
Ce qui donne :
Code :
|
Sinon, une telle erreur se trouve immédiatement avec un éditeur de texte qui surligne la syntaxe du PERL. Ainsi, tout ce qui suivait cette ligne était considéré comme une chaîne de caractères, ça se voit bien quand les lettres sont coloriées comme si elles étaient reconnues comme des chaînes
Marsh Posté le 27-06-2005 à 13:53:42
ok merci.
Pour l'éditeur j'ai pas le choix, je suis sur un serveur AIX via une console putty, bref VI obligatoire.
Sinon le IFS viens du script korn shell :
IFS=\;
Est-ce que dans ce cas là aussi ca correspond à un caractère d'échappement? (ce qui me semblerait logique au final)
Marsh Posté le 27-06-2005 à 13:58:52
thurfin a écrit : Sinon le IFS viens du script korn shell : |
Si c'est du ksh, oui en effet, \ est un caractère d'échappement.
En effet, ";" est interprété en ksh par "fin de la commande", un peu comme tu pourrais taper :
ls ; cp machin bidule ; echo "3 commandes sur une seule ligne" |
Donc pour pouvoir mettre ';' dans $IFS, il faut l'échapper, d'où le '\'.
Du coup, dans ton script PERL, tu devrais écrire ta ligne 79 comme ceci :
my $ifs = ";"; |
Marsh Posté le 27-06-2005 à 14:02:52
ok merci ca m'avance pas mal.
Marsh Posté le 28-06-2005 à 14:53:59
je voudrai mettre dans un tableau (@param) les donneée comprise dans une chaine ($params), les différents champs sont séparés par ";". Comment faire? En fait je vois pas comment arrêter la boucle.
Marsh Posté le 28-06-2005 à 14:59:37
Citation : je voudrai mettre dans un tableau (@param) les donneée comprise dans une chaine ($params), les différents champs sont séparés par ";". |
Avec split ?
my @param = split ';', $params; |
Marsh Posté le 28-06-2005 à 15:01:43
c'est aussi simple que ca ?
Marsh Posté le 28-06-2005 à 15:05:56
Marsh Posté le 29-06-2005 à 14:23:05
on peut utiliser le caractère '.' comme séparateur avec split ?
Parceque chez moi là ca semble pas marcher
Code :
|
Marsh Posté le 29-06-2005 à 14:34:52
thurfin a écrit : on peut utiliser le caractère '.' comme séparateur avec split ?
|
split ( http://perldoc.perl.org/functions/split.html ) :
split MOTIF, EXPR |
MOTIF signifie qu'il s'agit d'une expression régulière.
Or dans ces expressions, '.' signifie "n'importe quel caractère".
Pour lui dire de chercher des caractères '.', et non "n'importe quel caractère", il faut échapper avec un '\' :
Code :
|
Marsh Posté le 29-06-2005 à 14:36:39
merci, je me doutais d'un truc dans le genre, j'étais en train de tester avec / (en fait fallait le mettre dans l'autre sens)
Marsh Posté le 29-06-2005 à 15:05:45
Code :
|
j'ai une boucle de trop qui s'execute dans ce bout de code, il en fait 3 au lieu de 2, ca peut venir d'où ?
Marsh Posté le 29-06-2005 à 15:28:21
bizard ca me le fait aussi avec le début du code.
Si j'execute ca:
Code :
|
j'obtiens ca :
Citation : |
[edit] la ligne vide disparait si on ajoute "-1" aux foreach, mais ca me parait bizard, ca viens de perl ou de mon code ?
Marsh Posté le 29-06-2005 à 15:41:27
en gros tes fichiers doivent terminer par des lignes vide
apres tes chomp, ajoute soit
next if (! $line);
ou une condition
if (! $line)
qui englobe le reste de ton code
Marsh Posté le 29-06-2005 à 15:51:12
euh non mes fichiers ne se terminent pas par une ligne vide.
Marsh Posté le 29-06-2005 à 15:54:27
thurfin a écrit : euh non mes fichiers ne se terminent pas par une ligne vide. |
essaye avec le "next if (! $line)" et dit moi si ca fonctionne
Marsh Posté le 29-06-2005 à 16:00:50
scalar(@oids) retourne la taille du tableau, et toi ce que tu veux c'est l'index du dernier element
donc tu peux faire:
for my $z (0..(@oids-1)) {...
ou
for my $z (0..$#oids) {...
mais au fond si ton but est de recuperer la valeur du tableau, pourkoi ne fais tu pas directement ca:
for my $z (@oids) { ...
en Perl, kand on a à la fois besoin de l'index et de la valeur, on aura plus tendance à faire ca:
Code :
|
que ca:
Code :
|
Marsh Posté le 29-06-2005 à 16:04:09
merci, donc en fait c'est normal je suis rassuré.
Je vais laisser tel quel avec (@oid)-1 ca marche bien m^mem si c'est moins propre.
Marsh Posté le 22-06-2005 à 14:44:29
Bonjour,
Voilà comme indiquer dans le titre, je dois "traduire" un code shell en perl
Prb je rame sec (oui je connait pas perl, apprentissage sur le tas)
voici le code shell:
[quote]
HOME_STATS=.
TYPECFG=${HOME_STATS}/networkTypes.cfg
ITEMSCFG=${HOME_STATS}/networkItems.cfg
FLIC_LOG=${HOME_STATS}/logs
i=0
while IFS=':' read ip name type community ; do
ips[$i]=$ip
name[$i]=$name
types[$i]=$type
communities[$i]=$community
i=$((i+1))
done < ${ITEMSCFG}
[/quotes]
Explication: ce bout de script va chercher des infos dans un fichier dont le nom est stocké ds la variable ITEMCFG, à chaque ligne du fichiers on trouve diverse infos séparées par un caractère ":"
Dc concernant les lignes de déclaration de variable c'est bon c'est fait (pas dur )
Par contre pour la boucle qui va lire dans les fichiers j'ai essayé quelques truc mais bon vu mon niveau d'expérience en perl c'est pas gagné.
---------------
De Marx j'ai avant tout retenu la notion de capital