Bonjour,
J'ai un script avec Trois arguments d'entrée. Je dois verifier si le nombre des arguments qui sont saisis est correct. Je voudrai un coup de pouce sur la manière de faire!
Merci
Version imprimable
Bonjour,
J'ai un script avec Trois arguments d'entrée. Je dois verifier si le nombre des arguments qui sont saisis est correct. Je voudrai un coup de pouce sur la manière de faire!
Merci
NB : Si tu fais une application sérieuse, il vaut mieux que tu le documentes en POD et que tu utilises Pod::Usage (dans le CORE depuis Perl 5.6).Code:
1
2 my $usage = "Usage : $0 argument1 argument2 argument3\n"; die $usage unless @ARGV == 3;
--
Jedaï
Dans le cas d'une saisie éronnée du script ( trois arguments) :
par exemple:
perl concaten.pl Argument1 Argument2 Argument3 Argument4 (4 arguments)
ou
perl concaten.pl (0 arguments)
Le programme doit être arrêté en affichant : "Le nombre d'arguments est incorrect"
Et tu crois que mon code fait quoi ? le café ? :roll:
Il n'affiche pas exactement "Le nombre d'argument est incorrect", mais habituellement dans ce genre de cas, on affiche plutôt directement un exemple d'usage correct du script, c'est plus utile pour l'utilisateur.
--
Jedaï
J'ai posté le mail avant votre réponse (synchronisation). Je n'ai jamais pensé que c'était du café! :roll:
Néanmoins je cours le risque encore une fois de vous poser une autre question:
Comment on peut faire pr éliminer toutes les lignes vides dans un fichier!
Merci
(:aie: j'espère que je vaiss pas recevoir une gifle virtuelle:lol: )
Pour répondre à ta dernière question, un excellent topic signé Jedai :aie:
Je te suggère la méthode 2, auquel cas tu testes le contenu de la ligne que ton programme sera en train de lire. Si la ligne ne contient rien, hop tu la vires.
Ok, merci Arioch, c'est réglé...De maniere generale il est préférable d'utiliser les tableaux ou les fichiers ds les traitements, qui prend plus de ressources?
Les fichiers et les tableaux ne remplissent pas les mêmes rôles. Parles-tu des différentes méthodes que j'expose dans mon sujet sur la mise à jour de fichier ?Citation:
Envoyé par narmika
Sinon si tu parles d'employer un fichier "comme un tableau" :
Les grosses différences entre tableaux et fichiers sont les suivantes :
- Les fichiers sont persistants sur le disque, les tableaux éphèmères en mémoire
- Les tableaux occupent la mémoire RAM, les fichiers occupent le disque dur (nettement plus vaste que la RAM en temps normal).
- La lecture d'une valeur dans un tableau est en O(1) et très rapide, la lecture d'une ligne aléatoire dans un fichier est en O(n) et lente.
- L'écriture est en O(1) dans un tableau, en O(n) dans un fichier et horriblement lente !
Néanmoins le 3ème point peut-être amélioré par différente mesures : par exemple si les enregistrements sont de taille constante, la lecture est en O(1) bien qu'elle reste plus lente que dans un tableau. Il est également possible comme le fait Tie::File de mettre en place un tableau des offsets de débuts de ligne de façon à pouvoir accéder à une ligne donnée en O(1), même si la lecture reste lente.
De même les fichiers à enregistrements de taille constante permettent des écritures en O(1), et Tie::File permet de simuler un certain nombre d'écritures en O(1) mais est obliger de faire une écriture en O(n) à un moment ou un autre.
Généralement quand on a besoin d'une structure "type tableau", on utilise un vrai tableau sauf si l'ensemble des données est trop gros pour rentrer dans la mémoire RAM dont on dispose (exemple d'une telle utilisation : Sort::External). Il arrive également qu'on sérialize un tableau vers un fichier si on a besoin de persistance.
--
Jedaï
est ce qu'il se peut avoir un moyen de n'utiliser ni tableau ni fichier:
- j'ai un fichier sous forme
a b c d e
a b c d e
a b c d e
...
je veux extraire juste les éléments a la troisieme position : c
merci
De toute façon tu es obligé de lire le fichier pour en extraire les infos...
Dans ton cas par exemple, ton programme pourrait s'écrire en une ligne de commande :
ou sous Windows : (le shell traite les quotes différemment)Code:perl -pe '$_ = (split)[2]' ton_fichier_d_entree
Ou si tu as besoin de traitement complexe dans ton programme :Code:perl -pe "$_ = (split)[2]" ton_fichier_d_entree
--Code:
1
2
3
4
5
6
7
8
9 #!/usr/bin/env perl use strict; use warnings; while(<>){ my $interesting_field = (split)[2]; # traitement sur ton champ } __END__
Jedaï
ok, c'est une bonne idée. Si j'ai un fichier sous forme :
a \b c
a \b \b k
et je veux collecter les symboles qui sont juste apres les \b ==ca donne donc c et k.
est ce que je peux traiter les deux cas en même temps!
RegExp à affiner (plus les yeux en face des trous :aie: ) mais ça fonctionne :
Produit en sortie :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #!/usr/bin/perl use strict; use warnings; my @symbol_ok; foreach("a \b c", "a \b \b k") { if ($_ =~ /.*(\\b )*(.[^\\b]+)$/) { push(@symbol_ok, $2); } } foreach(@symbol_ok) { print "$_ récupéré\n"; }
Code:
1
2
3 >perl -w titi.pl c récupéré k récupéré
Oui, on peut affiner un peu la regex, pas beaucoup néanmoins :
Cela cependant (comme la regex d'Arioch) présuppose qu'il y a toujours un \b sur la ligne. Si on suppose que quand il n'y en a pas (si c'est possible) alors on prend le premier champ de la ligne, on devrait plutôt utiliser ça :Code:m/^.* \\b \s+ (\S+)/x
(en fait la regex d'Arioch marche quand il n'y a pas de \b sur la ligne, mais elle sélectionne les derniers caractères de la ligne, évidemment c'est peut-être le comportement correct...)Code:m/^(?:.* \\b \s+ | \s*) (\S+)/x
--
Jedaï
J'ai utilisé les deux méthodes mais ça donne des symboles aucun rapport avec le contenu.
Et en étant plus précis ?Citation:
Envoyé par narmika
Phrase cryptique s'il en est... Ma regex ou celle d'Arioch fonctionne parfaitement d'après ce que nous avions compris de ta question. Evidemment ta question n'était pas déjà des plus claires. Peut-être pourrais tu essayer d'être moins sibyllin ?Citation:
Envoyé par narmika
--
Jedaï
C'est bon , ta proposition marche. J'avvais oublié un \.
Si on veut tester si c'est un chemin est un fichier ou un dossier :
if(-f $chemin)
or if (-d chemin)
j'ai un petit problème : si je veux tester que si le chemin n'est ni dossier ni fichier! j'ai mis :
if ((!-f $chemin) &&(!-d $chemin))
{
print "error";
}
mais ça ne marche pas, il y'a quelque chose qui m'échappe.