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

Affecter un code retour aux tests, fonctions et global à un script ?

7 réponses
Avatar
ctobini
Bonjour =E0 tous,

Je suis sous Perl 5.* et Linux, je cherche =E0 retourner un code de retour =
g=E9n=E9ral dans un script Perl et des codes retours =E0 mes tests et fonct=
ions pouvant =EAtre recup=E9r=E9s par le syst=E8me.

Exemple type de ce que je souhaite faire :

use strict ;

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

print ma_fonc(0) ; # va provoquer une division par 0, erreur =E0 g=E9rer ic=
i ou dans la d=E9finition de fonction et possibilit=E9 d'affecter un code r=
etour au d=E9roulement de la fonction?

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

####### definition de fonction

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

Merci beaucoup si vous pouvez m'aider :)

Bonne journ=E9e,

C. Tobini

7 réponses

Avatar
espie
Tu cherches exit donc ?
Avatar
ctobini
Sauf erreur de ma part exit provoque une sortie du script :

if(-f fichier) { print "okn" ; exit 0 }
else { print "kon" ; exit 2 }

...

print "finn" ;

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.
Avatar
Nicolas George
ctobini , dans le message
, a écrit :
Sauf erreur de ma part exit provoque une sortie du script :



Oui.

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.
Avatar
espie
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);
Avatar
ctobini
Merci pour ces réponses, n'étant pas au taquet sur l'utilisation des cl asses en Perl, je vais prendre le temps de décortiquer au calme :-)

Concrètement, j'ai un script exécutant un traitement appliqué à plu sieurs 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 mai l 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 s ujet je serais preneur :-)
Avatar
espie
In article ,
ctobini wrote:

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 :-)



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...)
Avatar
Nicolas George
ctobini , dans le message
, a écrit :
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.