Discussion:
Affecter un code retour aux tests, fonctions et global à un script ?
(trop ancien pour répondre)
ctobini
2013-09-04 09:12:19 UTC
Permalink
Bonjour à tous,

Je suis sous Perl 5.* et Linux, je cherche à retourner un code de retour général dans un script Perl et des codes retours à mes tests et fonctions pouvant être recupérés par le système.

Exemple type de ce que je souhaite faire :

use strict ;

eval { print 3/0 } ;
if($@){ print "Erreur\n" } # Affecter un retour système type return 0 ?
else { print "ok\n" } # Affecter un retour système type return 2 ?

print ma_fonc(0) ; # va provoquer une division par 0, erreur à gérer ici ou dans la définition de fonction et possibilité d'affecter un code retour au déroulement de la fonction?

# fin du script
# Retour 0 si le script s'est bien passé et autre si ko ?

####### definition de fonction

sub ma_fonc() {
my($val) = @_ ;
return 15/$val ;
# => code de retour selon que ca se passe bien ou pas ?
}

Merci beaucoup si vous pouvez m'aider :)

Bonne journée,

C. Tobini
Marc Espie
2013-09-04 09:29:53 UTC
Permalink
Tu cherches exit donc ?
ctobini
2013-09-04 11:32:19 UTC
Permalink
Sauf erreur de ma part exit provoque une sortie du script :

if(-f fichier) { print "ok\n" ; exit 0 }
else { print "ko\n" ; exit 2 }

...

print "fin\n" ;

Admettons que je souhaite que le code retour 5 signifie "fichiers non trouvés" mais que je ne souhaite pas interrompre le script, exit ne me permet pas cette manip.
Nicolas George
2013-09-04 11:33:52 UTC
Permalink
ctobini , dans le message
Oui.
Post by ctobini
Admettons que je souhaite que le code retour 5 signifie "fichiers non
trouvés" mais que je ne souhaite pas interrompre le script, exit ne me
permet pas cette manip.
Dans ce cas, il faut se débrouiller pour appeler « exit 5 » au moment où on
veut que le script se termine, tout simplement.
Marc Espie
2013-09-04 13:03:41 UTC
Permalink
Ah, je pense que je comprend mieux la confusion.

Pour completer la reponse de Nicolas: il n'y a *pas* de statut du code
courant en perl, juste un appel systeme: exit(n) qui quitte avec n
comme code de retour (0<=n<255 pour etre plus precis).

La plupart des scripts se font un

my $rc = 0;


if (some_problem) {
$rc = code;
}

...

exit($rc);

comme pattern.


On *pourrait* presque faire un module avec ca, encapsuler le exit() dans
un END { exit($rc); } par exemple. Mais c'est pas forcement une tres
tres bonne idee, parce que ca va interferer gravement avec l'utilisation
que d'autres modules peuvent faire de END (qui s'attendent a pouvoir s'en
servir sans quitter abruptement avant avoir tout nettoye).

Si vraiment on veut "nettoyer" tout ca, pour de la structure de script
un tantinet uniforme, se baser sur Template Method peut etre une bonne idee.

Variations sur:


package AnyScript;

my $rc = 0;

sub set_rc
{
my $self = shift;
$rc = shift;

}

sub options
{
}

sub new
{
my $class =shift;
bless {}, $class;
}

sub main
{
my ($class, @p) = @_;
my $self = $class->new(@p);
$self->options(@p);
$self->run(@p);
exit($rc);
}

1;

...

package MonScript;
use parent AnyScript;
sub run
{
my ($self, @p) = @_;

if (error) {
$self->set_rc(42);
}
...
}

package main;
MonScript->main(@p);
ctobini
2013-09-04 14:30:26 UTC
Permalink
Merci pour ces réponses, n'étant pas au taquet sur l'utilisation des classes en Perl, je vais prendre le temps de décortiquer au calme :-)

Concrètement, j'ai un script exécutant un traitement appliqué à plusieurs clients :

my @clients = liste_clients ;

foreach my client(@clients) {
traitement ;
constitution d'un fichier zip ;
code_retour ?
}

Mon presta me demande de créer un code retour en fin de boucle à chaque fois qu'un client est traité afin de déclencher de son côté un mail vers le client. Je suis bloqué car si je mets un exit en fin de boucle je ne peux pas passer au client suivant... Si vous avez une idée sur le sujet je serais preneur :-)
Marc Espie
2013-09-04 14:40:41 UTC
Permalink
Post by ctobini
Merci pour ces réponses, n'étant pas au taquet sur l'utilisation des
classes en Perl, je vais prendre le temps de décortiquer au calme :-)
traitement ;
constitution d'un fichier zip ;
code_retour ?
}
Mon presta me demande de créer un code retour en fin de boucle à chaque
fois qu'un client est traité afin de déclencher de son côté un mail vers
le client. Je suis bloqué car si je mets un exit en fin de boucle je ne
peux pas passer au client suivant... Si vous avez une idée sur le sujet
je serais preneur :-)
Je pense que tu n'as pas tout compris a ce que veut ton presta. A priori,
ils veulent une indication pour chaque traitement, savoir si ca s'est
bien passe, ou pas, donc typiquement, l'affichage d'une ligne par
traitement, genre

0 id_client
5 id_client message d'erreur plus complet

soit dans un fichier de log, soit directement sur la sortie si elle ne sert
a rien de plus.

Le code de sortie de ton script, a priori, ca devrait etre "0" si tout va
bien, ou "autre chose" s'il y a eu une ou plusieurs erreurs.

Ca depend de ce que veut (et peut) faire ton presta...

Si le cout de setup de ton script n'est pas tres important, ca vaudrait
le coup separer en
- generation liste client
- traitement d'un client

comme ca apres, ca s'agrege en shell-script (ou autres) selon les gouts
du presta.

Bon.

Faut bien voir qu'un grand nombre de presta sont des abonnes des fichiers
batch auxquels ils ne comprennent rien, et il est vraisemblable qu'ils
ne comprennent pas bien le fonctionnement normal d'un script bien foutu.

A ce stade, c'est a toi d'aller discuter avec le presta un peu, histoire
d'etre sur que tu as compris ce qu'il veut (et histoire aussi de voir
s'il sait vraiment ce qu'il veut, ou si c'est juste "on va faire comme
ca parce qu'on faisait comme ca avant").

<rant>ce genre de decoupage conduit regulierement a des horreurs. Separer
les traitements et utiliser des abstractions intermediaires, en theorie, c'est
bien. Lorsque ca "permet" de perdre de l'information (code d'erreurs reduits
au lieu des erreurs completes) ou d'augmenter la latence (on fait un
batch apres l'autre, au lieu de paralleliser les traitements d'un batch
au suivant), on est dans le monde des shadocks^Wde l'informatique
d'entreprise.

(l'informatique d'entreprise est a l'informatique ce que la musique
militaire est a la musique...)
Nicolas George
2013-09-04 14:41:42 UTC
Permalink
ctobini , dans le message
Post by ctobini
Mon presta me demande de créer un code retour en fin de boucle à chaque
fois qu'un client est traité afin de déclencher de son côté un mail vers
le client. Je suis bloqué car si je mets un exit en fin de boucle je ne
peux pas passer au client suivant... Si vous avez une idée sur le sujet je
serais preneur :-)
Il n'y a pas de code de retour s'il n'y a pas de retour.

Continuer la lecture sur narkive:
Loading...