OVH Cloud OVH Cloud

subroutine

7 réponses
Avatar
kurtz le pirate
bonjour,


j'ai écrit une petite "sub" qui permet d'afficher les caractères de
controles d'une chaine. si par exemple la chaine contient un "tab", la
routine affiche "^T". pouur m'en servir, je suis obligé d'ecrire :

printf "xxx xxx %s xxx",printCtrl($myString);

existe-il un autre moyen ? ou bien, je me prend la tête pour
quelquechose qui existe déja ?


merci

--
klp

7 réponses

Avatar
Nicolas George
kurtz le pirate wrote in message
:
j'ai écrit une petite "sub" qui permet d'afficher les caractères de
controles d'une chaine. si par exemple la chaine contient un "tab", la
routine affiche "^T".


Usuellement, c'est ^I pour tab.

pouur m'en servir, je suis obligé d'ecrire :

printf "xxx xxx %s xxx",printCtrl($myString);

existe-il un autre moyen ?


Euh... Tu voudrais quel genre de moyen ?

Avatar
kurtz le pirate
In article <e0orj8$1o5g$,
Nicolas George <nicolas$ wrote:

kurtz le pirate wrote in message
:
j'ai écrit une petite "sub" qui permet d'afficher les caractères de
controles d'une chaine. si par exemple la chaine contient un "tab", la
routine affiche "^T".


Usuellement, c'est ^I pour tab.


oooosp ! oui, oui, ^I


pouur m'en servir, je suis obligé d'ecrire :

printf "xxx xxx %s xxx",printCtrl($myString);

existe-il un autre moyen ?


Euh... Tu voudrais quel genre de moyen ?


un truc du "genre" : print "blabla printCtrl($myString)";


--
klp


Avatar
Jacques Caron
Salut,

On Sun, 02 Apr 2006 18:48:25 +0200, kurtz le pirate
wrote:

un truc du "genre" : print "blabla printCtrl($myString)";


Ce sera donc, au choix:

print "blabla ".printCtrl($myString)."la suite";
print join "","blabla ",printCtrl($myString),"la suite";

En fait, ce que tu fais peut probablement être résumé en une seule regex,
du genre:

$chaine =~ s/([01-32])/sprintf("^%c",$1+64)/eg;

Celle-là ne marche que pour les caractères affichables sous la forme
^lettre, mais on peut généraliser:

$chaine =~ s/([^ -x7e])/printCtrl($1)/eg;

Il y a tout un tas d'autres façons de l'écrire, probablement... TMTOWTDI

Jacques.
--
Oxado http://www.oxado.com/

Avatar
kurtz le pirate
In article ,
"Jacques Caron" wrote:

Salut,

On Sun, 02 Apr 2006 18:48:25 +0200, kurtz le pirate
wrote:

un truc du "genre" : print "blabla printCtrl($myString)";


Ce sera donc, au choix:

print "blabla ".printCtrl($myString)."la suite";
print join "","blabla ",printCtrl($myString),"la suite";


mais oui ! j'y ai même pas pensé :(



En fait, ce que tu fais peut probablement être résumé en une seule regex,
du genre:

$chaine =~ s/([01-32])/sprintf("^%c",$1+64)/eg;


arggggg.... non, moi j'ai fais cette horreur :
sub printCtrl {
my $thisString=shift;
if ($thisString=~/p{IsCntrl}/) {
my $myString="";
for(my $i=0; $i<length($thisString); $i++) {
my $myChar = ord(substr($thisString,$i,1));
if ($myChar<32) {
$myString = $myString."^".chr($myChar+64);
}
else {
$myString=$myString.chr($myChar);
}
}
return $myString;
}
else {
return $thisString;
}
}

... mais je vais corriger ça tout de suite :)


Celle-là ne marche que pour les caractères affichables sous la forme
^lettre, mais on peut généraliser:

$chaine =~ s/([^ -x7e])/printCtrl($1)/eg;

Il y a tout un tas d'autres façons de l'écrire, probablement... TMTOWTDI

Jacques.


MERCI !

--
klp


Avatar
kurtz le pirate
In article ,
"Jacques Caron" wrote:

En fait, ce que tu fais peut probablement être résumé en une seule regex,
du genre:

$chaine =~ s/([01-32])/sprintf("^%c",$1+64)/eg;



c'est encore moi :(

avec ma fonction, j'obtiens des trucs du genre :
/Users/admin/Datas/XPress/Icon^M

qui est conforme à ce que j'attends.


avec ta regexp utilisee comme a :
104 : sub printCtrl {
105 : my $thisString=shift;
106 : $thisString =~ s/([01-32])/sprintf("^%c",$1+64)/eg;
107 : return $thisString;
108 : }


j'obtiens : /Users/admin/Datas/Word/Icon^@, qui ne correspond pas la
réalité et en plus, il y a des erreurs qui remontent pendant l'execution
du script :
Argument "r" isn't numeric in addition (+) at findSame.pl line 106.


l'utilisation de la fonction printCtrl se fait comme là :

...
my $thisSize = stat($_)->size;
my $thisInfos = {
'directory' => $File::Find::dir,
'fileName' => printCtrl($_),
'fileSize' => $thisSize
};
push (@{$filesDB{$thisMD5}}, $thisInfos);
...

désolé mais je ne comprends pas ou/pourquoi ça coince ! j'ai ré-ouvert
le 'camel book' pour bien comprendre le 's///eg' mais je ne vois
vraiment pas.

c'est pénible les débutants non ?


--
klp

Avatar
Jacques Caron
Salut,

On Tue, 04 Apr 2006 18:26:47 +0200, kurtz le pirate
wrote:

avec ta regexp utilisee comme a :
104 : sub printCtrl {
105 : my $thisString=shift;
106 : $thisString =~ s/([01-32])/sprintf("^%c",$1+64)/eg;
107 : return $thisString;
108 : }


j'obtiens : /Users/admin/Datas/Word/Icon^@, qui ne correspond pas la
réalité et en plus, il y a des erreurs qui remontent pendant l'execution
du script :
Argument "r" isn't numeric in addition (+) at findSame.pl line 106.


J'avions pas testé, oups.

$string =~ s/([01-32])/sprintf("^%c",ord($1)+64)/eg;

Devrait mieux le faire.

Jacques.
--
Oxado http://www.oxado.com/

Avatar
kurtz le pirate
In article ,
"Jacques Caron" wrote:

J'avions pas testé, oups.

$string =~ s/([01-32])/sprintf("^%c",ord($1)+64)/eg;

Devrait mieux le faire.

Jacques.


et plus c'est évident ! je suis vraiment mauvais :((
merci


--
klp