OVH Cloud OVH Cloud

filehandle parametrable

6 réponses
Avatar
Patrice Karatchentzeff
Bonjour,

Je voudrai rendre mon script plus ou moins bavard selon le contexte...

La première idée que j'ai eu est d'avoir un filehandle dédié (disons
VERBOSE) en truffant mon code de :

print VERBOSE "tout ce que vous avez toujours voulu savoir ici\n" ;

puis en imposant VERBOSE à STDOUT en début de script suivant les
options choisies, du genre

VERBOSE=STDOUT if $verbose ;

Seulement je ne vois pas trop comment écrire la dernière commande...

Je pourrai écrire partout

print "tout... " if $verbose ;

mais je trouve cela plus lourd...

Une idée ? Peut-être y a-t-il une astuce ou un truc qui m'échappe ?

Merci d'avance,

PK

--
      |\      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:p.karatchentzeff@free.fr
     |,4-  ) )-,_. ,\ (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'\_)       

6 réponses

Avatar
Stéphane Müller
Il faut utiliser une variable pour le handle de fichier. Quelque chose comme cela :

use FileHandle;
use File::Spec;
...
# Si $Verbose alors $OUT => SDTOUT sinon $OUT => 'nul' ou '/dev/null' selon l'OS
$OUT = $Verbose ? *STDOUT : new FileHandle '>'.File::Spec->devnull();
...
print $OUT 'Lorem ipsum dolor sit amet ...';

Stéphane


"Patrice Karatchentzeff" a écrit dans le message de news:

Bonjour,

Je voudrai rendre mon script plus ou moins bavard selon le contexte...

La première idée que j'ai eu est d'avoir un filehandle dédié (disons
VERBOSE) en truffant mon code de :

print VERBOSE "tout ce que vous avez toujours voulu savoir icin" ;

puis en imposant VERBOSE à STDOUT en début de script suivant les
options choisies, du genre

VERBOSE=STDOUT if $verbose ;

Seulement je ne vois pas trop comment écrire la dernière commande...

Je pourrai écrire partout

print "tout... " if $verbose ;

mais je trouve cela plus lourd...

Une idée ? Peut-être y a-t-il une astuce ou un truc qui m'échappe ?

Merci d'avance,

PK

--
| _,,,---,,_ Patrice KARATCHENTZEFF
ZZZzz /,`.-'`' -. ;-;;,_ mailto:
|,4- ) )-,_. , ( `'-' http://p.karatchentzeff.free.fr
'---''(_/--' `-'_)


Avatar
Patrice Karatchentzeff
"Stéphane Müller" writes:

Il faut utiliser une variable pour le handle de fichier. Quelque chose comme cela :

use FileHandle;
use File::Spec;
...
# Si $Verbose alors $OUT => SDTOUT sinon $OUT => 'nul' ou '/dev/null' selon l'OS
$OUT = $Verbose ? *STDOUT : new FileHandle '>'.File::Spec->devnull();
...
print $OUT 'Lorem ipsum dolor sit amet ...';


Impec : merci.

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       

Avatar
Patrice Karatchentzeff
Patrice Karatchentzeff writes:

"Stéphane Müller" writes:

Il faut utiliser une variable pour le handle de fichier. Quelque chose comme cela :

use FileHandle;
use File::Spec;
...
# Si $Verbose alors $OUT => SDTOUT sinon $OUT => 'nul' ou '/dev/null' selon l'OS
$OUT = $Verbose ? *STDOUT : new FileHandle '>'.File::Spec->devnull();
...
print $OUT 'Lorem ipsum dolor sit amet ...';


Impec : merci.


Parlé trop vite  :(

J'ai réécrit le code ainsi :

use strict ;
use warnings ;
use Carp ;
use English ;

my $VERBOSE ;

if ($verbose) {
$VERBOSE = *STDOUT ;
}
else {
open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
}})

print $VERBOSE "Carthago delenda estn" ;

et j'obtiens :

Can't use string ("") as a symbol ref while "strict refs" in use at...
pour le open $VERBOSE (ou le print c'est selon).

C'est le use strict qui met le souk mais je ne vois pas comment
contourner sans le désactiver (ce que je ne veux pas)...

Une idée ?

Merci

PK

PS : sinon cela fonctionne bien : merci de l'idée.

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       


Avatar
Klaus
Patrice Karatchentzeff wrote:
J'ai réécrit le code ainsi :

use strict ;
use warnings ;
use Carp ;
use English ;

my $VERBOSE ;

if ($verbose) {
$VERBOSE = *STDOUT ;
}
else {
open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
}})

print $VERBOSE "Carthago delenda estn" ;

et j'obtiens :

Can't use string ("") as a symbol ref while "strict refs" in use at...
pour le open $VERBOSE (ou le print c'est selon).


Je n'obtiens pas ce message, par contre, j'obtiens 2 autres messages:

1. Global symbol "$verbose" requires explicit package name
2. Unmatched right curly bracket at test43.plz line 23, at end of line

Bon, je corrige les erreurs des 2 messages (c'est à dire je rajoute
une ligne "my $verbose" et je vire les paranthèses "}})" à la fin) et
ça marche impec:

========================= =========
use strict ;
use warnings ;
use Carp ;
use English ;

my $VERBOSE ;

my $verbose = 1;

if ($verbose) {
$VERBOSE = *STDOUT ;
}
else {
open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
========================= =========

Juste une petite remarque supplémentaire: si tu as encore des
problèmes avec le message >>Can't use string ("") as a symbol ref<<,
alors essaie de rajouter des lignes "*** rajout ***" (juste avant le
"open $VERBOSE"):

========================= =========
use strict ;
use warnings ;
use Carp ;
use English ;

my $VERBOSE ;

my $verbose = 1;

if ($verbose) {
$VERBOSE = *STDOUT ;
}
else {

# ******** rajout ********************
unless (defined $VERBOSE) {
die "MINCE, ZUT ALORS!!!!, je viens de déclarer ".
"$VERBOSE sans valeur, mais cette p.....aine ".
"variable a une valeur ($VERBOSE), et en plus ".
"je ne sais pas d'où elle vient cette valeur !!!!";
}
# ******** rajout ********************

open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
========================= =========

Avatar
Klaus
Klaus wrote:
Juste une petite remarque supplémentaire: si tu as encore des
problèmes avec le message >>Can't use string ("") as a symbol ref<<,
alors essaie de rajouter des lignes "*** rajout ***" (juste avant le
"open $VERBOSE"):

======================== ==========
use strict ;
use warnings ;
use Carp ;
use English ;

my $VERBOSE ;

my $verbose = 1;

if ($verbose) {
$VERBOSE = *STDOUT ;
}
else {

# ******** rajout ********************
unless (defined $VERBOSE) {


Je suis désolé, j'ai fait erreur logique, il faut dire "if", et non
pas "unless":

if (defined $VERBOSE) {


die "MINCE, ZUT ALORS!!!!, je viens de déclarer ".
"$VERBOSE sans valeur, mais cette p.....aine ".
"variable a une valeur ($VERBOSE), et en plus ".
"je ne sais pas d'où elle vient cette valeur !!!!";


Je suis désolé, j'ai fait une erreur de communication, il faut dire
"Il y a un problème", et non pas "MINCE, ZUT ALORS!!!!...."

die "Il y a un problème avec variable $VERBOSE ".
"= .'$VERBOSE' qui ne devrait pas être définie, ".
"mais elle l'est";

}
# ******** rajout ********************

open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
======================== ==========


Avatar
Patrice Karatchentzeff
"Klaus" writes:

[...]

Je n'obtiens pas ce message, par contre, j'obtiens 2 autres messages:

1. Global symbol "$verbose" requires explicit package name
2. Unmatched right curly bracket at test43.plz line 23, at end of line


Oui : autant pour moi, j'ai essayé de réduire mon script à sa plus
faible représentation du problème et je n'ai même pas fait tourner
l'exemple. Désolé.

Bon, je corrige les erreurs des 2 messages (c'est à dire je rajoute
une ligne "my $verbose" et je vire les paranthèses "}})" à la fin) et
ça marche impec:


[...]

Exact. Pour moi aussi et sur mon script... comprends pas ce qui s'est
passé la dernière fois.

Juste une petite remarque supplémentaire: si tu as encore des
problèmes avec le message >>Can't use string ("") as a symbol ref<<,
alors essaie de rajouter des lignes "*** rajout ***" (juste avant le
"open $VERBOSE"):


(...)

# ******** rajout ********************
unless (defined $VERBOSE) {
die "MINCE, ZUT ALORS!!!!, je viens de déclarer ".
"$VERBOSE sans valeur, mais cette p.....aine ".
"variable a une valeur ($VERBOSE), et en plus ".
"je ne sais pas d'où elle vient cette valeur !!!!";
}
# ******** rajout ********************

open $VERBOSE, ">", "/dev/null"
or croak "Can't redirect output to /dev/null : $OS_ERRORn" ;
}
=================================
C'est p'têt cela... dans tous les cas, cela ne fait pas de mal de

blinder le tout correctement.

Merci

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)