Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Commande unix ecrite en Perl

7 réponses
Avatar
David C.
Qui peut tester ma commande unix ?
Je l'ecris en perl
La derniere version est disponible
sur www.toolunix.com/test dans
le repertoire last-31-07-2003.
mettez la dans le repertoire
/usr/bin et tapez :
tlx --help
envoyez moi tous vos commentaires
sur la commande ou sur son code.

merci

7 réponses

Avatar
root
On Thu, 31 Jul 2003 17:53:55 +0200, David C. wrote:

Qui peut tester ma commande unix ?
Je l'ecris en perl
La derniere version est disponible
sur www.toolunix.com/test dans
le repertoire last-31-07-2003.
mettez la dans le repertoire
/usr/bin et tapez :
tlx --help
envoyez moi tous vos commentaires
sur la commande ou sur son code.

merci


$ perl tlx
Use of uninitialized value in string eq at tlx line 21.
Use of uninitialized value in string eq at tlx line 22.
Use of uninitialized value in string eq at tlx line 23.
Use of uninitialized value in string eq at tlx line 24.
$

- si pas d'arguments, alors afficher l'aide ...
- utilise Getopt::Std ou Getopt::Long pour traiter les arguments/options,
peut être que dans ton cas c'est "pas vraiment utile" mais perso depuis
que je l'utilise je me pose même pas la question de l'utilité, et je
l'utilise direct pour tous mes scripts avec arguments/options :)
- toujours vérifier les codes erreurs des open/opendir/etc. ...
- heu ... ton truc, ça pourrais pas être fait tout simplement en utilisant
File::Find ?
- évite d'utiliser le open(F,">$f") mais utilise plutot la forme à 3
arguments open(F, ">", $f) ça évite les problèmes avec des fichiers qui
seraient nommés '>toto' ...

Voilà voilà pour commencer ;)

Avatar
David C.
Mais que pensez vous en ce qui
concerne la qualité de mon code ?
Avatar
root
On Thu, 31 Jul 2003 20:10:07 +0200, David C. wrote:

Mais que pensez vous en ce qui
concerne la qualité de mon code ?


ça dépend de ce qu'on met dans "qualité" :)

Un code de "qualité" pour moi, serait un code simple, lisible, dont on
comprend ce qu'il fait en parcourant rapidement son code, et utilisant a
bon escient les particularités du langage pour simplifier certains
traitements (et c'est peut être là le problème de Perl) ...

Ensuite pour la forme, on peux essayer de respecter le perlstyle :

$ perldoc perlstyle

Par exemple, tu pourrais utiliser des elsif plutôt que tes if successifs,
puisqu'on ne peut pas faire un --listage et un --user en même temps :

if( $arguments[0] eq "--listage" ) {
listage_main(@arguments);
} elsif( $arguments[0] eq "--lstdout" ) {
listage_main(@arguments)
} elsif( $arguments[0] eq "--user" ) {
user($arguments[1])
} else {
help();
}

Dans ton algo de listage on doit, je pense, pouvoir faire plus "simple"
... et plus "perlien" ...

Voilà ce que je ferais par exemple pour une fonction listdir("/rep")
récursive :

-->8--
sub listdir {
my $dir = shift;

return if( not defined $dir or ! -d $dir );

$dir =~ s//$//;

opendir(DIR, $dir) or return;

my @files = map { $dir."/".$_ }
grep { ! m/^..?$/ && ! -l $dir."/".$_ } readdir(DIR);

foreach my $file (@files) {
if( -d $file ) {
listdir($file);
} else {
print "$filen";
}
}

return;
}
--8<--

Et comme on dit en Perl: TIMTOWTDI - "There Is More Than One Way To Do It" !

Avatar
David C.
oki !
Oui j'ai pleins de chose à modifier,
je vais le faire ensuite je refais
passer la source.
Avatar
David C.
J'ai modifié le code de la commande.
Il est disponible sur :

http://toolunix.com/test/last-02-08-2003/tlx

Vous en pensez quoi à présent ?
Quels sont les defauts ?
Je n'ai pas utilisé d'objets
car je cherche à m'entrainer sans.

David
Avatar
root
On Sat, 02 Aug 2003 10:30:21 +0200, David C. wrote:

J'ai modifié le code de la commande.
Il est disponible sur :

http://toolunix.com/test/last-02-08-2003/tlx

Vous en pensez quoi à présent ?
Quels sont les defauts ?
Je n'ai pas utilisé d'objets
car je cherche à m'entrainer sans.

David


Tu trouves pas qu'il y a qqe chose de redondant dans ce bout de code :

elsif ($arguments[0] eq "--help") {
help;
} else {
help;
}

Le code :

help if (!defined($ARGV[1]));
help if (!defined($ARGV[2]));

peut être remplacé par :

help if( not defined $ARGV[1] or not defined $ARGV[2] );

ou bien en comptant le nombre d'arguments :

help if( $#arguments < 2 );

C'est bien d'apprendre, mais ça ne veux pas dire ne pas apprendre à se
servir de modules existants ...
Par exemple, un bout de code en utilisant Getopt::Long :

use Getopt::Long;

my $login = undef;
my $dir = undef;
my $output = undef;

GetOptions(
"user|u=s" => $login,
"list|l=s" => $dir,
"output|o=s" => $output,
"help|h" => &help, # on execute directement help() si --help
) or help();

# on verifie qu'on utilise bien -u ou -l mais pas les deux
# en même temps
help() if( ! (not defined $user xor not defined $dir) );

# ouverture du fichier de sortie
if( defined $output ) {
open(OUTPUT, "> ", $output) or die "Error opening output file $output : $!n";
} else {
# si pas de fichier alors on redirige vers STDOUT (voir typeglob)
*OUTPUT = *STDOUT;
}

if( defined $login ) {
listuser($login);
} elsif( defined $dir ) {
listdir($dir);
} else {
print STDERR "Hey ! You are not supposed to be here !n";
help();
}

exit 0;

sub help {
print STDERR "Blah Blah Blah version 0.0.1
Usage: perl $0 --list|-l <directory> [--output|-o <output file>]
perl $0 --user|-u <user> [--output|-o <output file>]
perl $0 --help|-h
";
exit 1;
}

Pour moi, ça me parait plus clair comme ça, mais c'est un avis personnel
... ça simplifie la gestion des arguments, et on reste consistant avec le
fonctionnement "standard" des outils sous Unix ...

Ensuite pour l'ouverture du fichier de sortie, on évite ainsi de devoir
mettre un 'if( $arguments[0] ne "--lstdout" ) { } else { }' à chaque fois
qu'on veut afficher qqe chose, il suffit d'utiliser simplement un 'print
OUTPUT blah blah' et la sortie se fera automatiquement dans le fichier
selectionné ou sur STDOUT.

Et puis on a tellement pas l'habitute de voir un 'xor' que je me suis
senti obligé de poster ce bout de code ;)

Maintenant, comme on dit, c'est en forgeant qu'on devient forgeron ...

Bye

Avatar
Thierry Boudet
In article , root wrote:

Maintenant, comme on dit, c'est en forgeant qu'on devient forgeron ...

C'est en rootant que l'on devient rooté.

From: root


--
Peer-to-peer, c'est le sujet de ma thèse :) Donc c'est utile, et ca
rapporte des diplômes. Et des sous.
Ca rapporte une thèse ?