OVH Cloud OVH Cloud

problème d'évaluation de variable d'environnement

8 réponses
Avatar
Tribulations Parallèles
Bonjour à tous,

J'ai créé un programme en shell qui me crée toutes les couleurs de terminal
possibles sur ma machine.
Je voudrais les récupérer dans un programme Perl. J'ai suivi les conseils de
l'un d'entre vous qui m'avait dit d'utiliser %ENV. Seulement, je n'arrive
pas à interpréter la couleur dans Perl, je n'ai que la chaine de caractères
correspondante, alors que cela marche dans le shell.

Ainsi, si dans bash, je tape:

$ export color='\e[92m\e[100m'
$ echo -e "$color foo"

Cela me sort foo en couleur.
Maintenant, si je constitue un programme Perl color.pl contenant les lignes
suivantes:

#!/usr/bin/perl -w

print "$ENV{color}\n";


Et que je l'exécute:
$ perl color.pl
\e[92m\e[100m

J'obtiens donc le code de couleur, pas la couleur.
J'ai l'impression que ça vient de la façon dont Perl parse la ligne print;
j'ai donc essayé de jouer avec eval, mais sans succès.
Comment faire?

Merci d'avance,

Julien

8 réponses

Avatar
Mark Clements
Tribulations Parallèles wrote:
Bonjour à tous,

J'ai créé un programme en shell qui me crée toutes les couleurs de terminal
possibles sur ma machine.
Je voudrais les récupérer dans un programme Perl. J'ai suivi les conseils de
l'un d'entre vous qui m'avait dit d'utiliser %ENV. Seulement, je n'arrive
pas à interpréter la couleur dans Perl, je n'ai que la chaine de caractères
correspondante, alors que cela marche dans le shell.

Ainsi, si dans bash, je tape:

$ export color='e[92me[100m'
$ echo -e "$color foo"

Cela me sort foo en couleur.
Maintenant, si je constitue un programme Perl color.pl contenant les lignes
suivantes:

#!/usr/bin/perl -w

print "$ENV{color}n";


Et que je l'exécute:
$ perl color.pl
e[92me[100m

J'obtiens donc le code de couleur, pas la couleur.
J'ai l'impression que ça vient de la façon dont Perl parse la ligne print;
j'ai donc essayé de jouer avec eval, mais sans succès.
Comment faire?


Term::ANSIColor?

:~$ perldoc -q color
Found in /usr/share/perl/5.8/pod/perlfaq8.pod
How do I print something out in color?

In general, you don't, because you don't know whether the recipient has
a color-aware display device. If you know that they have an ANSI
terminal that understands color, you can use the Term::ANSIColor module
from CPAN:

use Term::ANSIColor;
print color("red"), "Stop!n", color("reset");
print color("green"), "Go!n", color("reset");

Or like this:

use Term::ANSIColor qw(:constants);
print RED, "Stop!n", RESET;
print GREEN, "Go!n", RESET;


Ce n'est pas exacement ce que t'as demandé, mais il se peut que ça suffisse.

Mark

Avatar
jl_morel
Dans l'article <458e5805$0$2113$,
a dit...
[..]

Ainsi, si dans bash, je tape:

$ export color='e[92me[100m'
$ echo -e "$color foo"

Cela me sort foo en couleur.
Maintenant, si je constitue un programme Perl color.pl contenant les lignes
suivantes:

#!/usr/bin/perl -w

print "$ENV{color}n";


Et que je l'exécute:
$ perl color.pl
e[92me[100m

J'obtiens donc le code de couleur, pas la couleur.
[..]



Pour interpoler les e dans votre chaîne une substitution suffit :

#!/usr/bin/perl -w

$ENV{color} =~ s/e/e/g;

print "$ENV{color}n";


HTH

--
J-L.M.
http://www.bribes.org/perl

Avatar
Tribulations Parallèles
Jean-Louis MOREL wrote:

$ENV{color} =~ s/e/e/g;

print "$ENV{color}n";


Merci, cela marche donc.
Mais pourquoi le e du shell est transformé en e dans Perl?
J'ai cherché dans la doc, sans succès. Où trouver l'info correspondante dans
la doc Perl en ligne de commande?

C'est un comportement un peu embêtant, car je me vois mal faire cette
substitution à chaque fois que je vais utiliser une couleur. N-y a-t-il pas
une option de Perl à activer, ou quelque chose du genre, pour empêcher
qu'il interprète ainsi le e de la variable d'environnement?

Merci

Julien

Avatar
Tribulations Parallèles
Mark Clements wrote:

Ce n'est pas exacement ce que t'as demandé, mais il se peut que ça
suffisse.


Merci pour ta réponse.
En effet, je préfèrerais garder mes couleurs que j'ai laborieusement créé à
la volée dans bash. J'avais vu ce module Perl, mais je préfèrerais m'en
passer.

Julien

Avatar
Tribulations Parallèles
Jean-Louis MOREL wrote:

$ENV{color} =~ s/e/e/g;


Autre question qui me vient à l'esprit: cette substitution est moins lourde
si je peux la faire dans plein de "cellules" du hash en même temps. Voici
ce que je voudrais faire, tu vas comprendre tout de suite:

$ENV{color*} =~ s/e/e/g;

Ainsi, je veux faire cette substitution d'un coup dans toutes les cellules
dont la clé s'appelle "color" suivie d'autres caractères (ex:
colorwhiteonblue, colorredonblack, etc.)

Cette syntaxe n'est pas valide.
Comment procéder, et est-ce possible?

Julien

Avatar
jl_morel
Dans l'article <458e87a7$0$32362$,
a dit...

Jean-Louis MOREL wrote:

$ENV{color} =~ s/e/e/g;

print "$ENV{color}n";


Merci, cela marche donc.
Mais pourquoi le e du shell est transformé en e dans Perl?
J'ai cherché dans la doc, sans succès. Où trouver l'info correspondante dans
la doc Perl en ligne de commande?

C'est un comportement un peu embêtant, car je me vois mal faire cette
substitution à chaque fois que je vais utiliser une couleur. N-y a-t-il pas
une option de Perl à activer, ou quelque chose du genre, pour empêcher
qu'il interprète ainsi le e de la variable d'environnement?



La variable d'environnement contient la chaîne comme vous l'avez tapée au
clavier. La substitution s/e/e/g ne fait que remplacer la chaîne formée
des deux caractères '' et 'e' en le caractère ESC (code ASCII 27 en
décimal).

Il n'y a aucune raison pour que cette conversion soit automatique pour
toutes les variables d'environnement (ni d'ailleurs pour les chaînes
fournies par @ARGV ou <STDIN>).

Je suis sous Windows. Le caractère de séparation des noms de chemins est .
Si la variable Path contient c:perlembrouillebin il n'est pas du tout
souhaitable que e soit transformer en caractère ESC ! Vous voyez
l'embrouille ?

--
J-L.M.
http://www.bribes.org/perl


Avatar
jl_morel
Dans l'article <458e899c$0$32362$,
a dit...

Autre question qui me vient à l'esprit: cette substitution est moins lourde
si je peux la faire dans plein de "cellules" du hash en même temps. Voici
ce que je voudrais faire, tu vas comprendre tout de suite:

$ENV{color*} =~ s/e/e/g;

Ainsi, je veux faire cette substitution d'un coup dans toutes les cellules
dont la clé s'appelle "color" suivie d'autres caractères (ex:
colorwhiteonblue, colorredonblack, etc.)



On peut faire une boucle sur les clés du hash %ENV et ne faire la substitution
que si la clé commence par color :

foreach (keys %ENV) {
$ENV{$_} =~ s/e/e/g if /^color/i;
}

--
J-L.M.
http://www.bribes.org/perl

Avatar
Tribulations Parallèles
Jean-Louis MOREL wrote:

tout souhaitable que e soit transformer en caractère ESC ! Vous voyez
l'embrouille ?


Oui, cela y est, j'ai compris.
Merci beaucoup pour l'explication et la solution.

Bonnes (fin de) fêtes

Julien