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

string as array ?

4 réponses
Avatar
kurtz le pirate
bonsoir, bonsoir...

existe t'il un moyen de lire une chaine de caractères comme un tableau ?
autre que substr() bien sur.

merci


--
klp

4 réponses

Avatar
Emmanuel Florac
Le Sun, 23 Apr 2006 18:38:51 +0200, kurtz le pirate a écrit :

bonsoir, bonsoir...

existe t'il un moyen de lire une chaine de caractères comme un tableau ?
autre que substr() bien sur.


Non, mais quel intérêt? Attention à poser la bonne question, sous peine
d'avoir la mauvaise réponse... Les solutions classiques en C ne sont pas
forcément commodes ou adaptées en perl.

Si tu veux convertir une chaîne en tableau, tu peux utiliser split avec
la chaîne vide comme argument. Split renvoie une liste, qu'on peut donc
itérer directement comme un tableau :

$chaine=q(am stram gram pic et pic et colegram);
foreach $char ( split '', $chaine ) { print "$char#" }


--
Le commissaire : Comment vous appelez-vous?
Garance : Moi je ne m'appelle jamais, je suis toujours là. J'ai pas
besoin de m'appeler. Mais les autres m'appellent Garance, si ça peut
vous intéresser.
Prévert,"les enfants du Paradis".

Avatar
kurtz_le_pirate
"Emmanuel Florac" a écrit dans le message de
news:

bonsoir, bonsoir...

existe t'il un moyen de lire une chaine de caractères comme un
tableau ?
autre que substr() bien sur.


Non, mais quel intérêt?


accéder directement en lecture/ecriture à un octet...


Attention à poser la bonne question, sous peine
d'avoir la mauvaise réponse... Les solutions classiques en C ne sont
pas
forcément commodes ou adaptées en perl.


oui tu as raison. c'est vrai que je pensais plutôt à un truc du grenre
:
my $buffer;
my @array;

$buffer=<F>;
$ref_buffer=$buffer;

@array=$ref_buffer;
et pour pourvoir faire :
$car = $array[$i] et $array[$i]="a"

la syntaxe n'est surement pas la bonne, ni la méthode peut être
mais l'idée est la.

a+
--
klp


Avatar
Emmanuel Florac
Le Tue, 25 Apr 2006 08:36:14 +0200, kurtz_le_pirate a écrit :


la syntaxe n'est surement pas la bonne, ni la méthode peut être mais
l'idée est la.


Dans ce cas, split fonctionne :

$string="abcdef";
@arr=split( '', $string);
# affiche b
print $arr[1];


--
Dix grammes d'abstraction valent des tonnes de bricolage.
Loi de Booker.

Avatar
Paul Gaborit
À (at) Tue, 25 Apr 2006 08:36:14 +0200,
"kurtz_le_pirate" écrivait (wrote):
"Emmanuel Florac" a écrit dans le message de
news:
Non, mais quel intérêt?


accéder directement en lecture/ecriture à un octet...


Comme d'habitude en Perl, il existe plein de moyens différents.

La transformation de la chaîne de caractères en tableau fonctionne
mais est loin d'être efficace tout du moins en place mémoire
occupée. Pour les performances, il faudrait faire des tests mais je
pense que c'est aussi plus lent que les solutions ci-dessous.

De plus, comme avec la solution 'substr' ci-dessous, si la chaîne
contient des caractères unicode (ou wide caractères) et si on la
découpe par un 'split', on traite véritablement une chaîne de
caractères (unicode) et non une chaîne d'octets.

Voici deux autres solutions qui évitent le passage par un tableau.

1- L'utilisation de substr est intéressante (pourquoi s'en priver ?) :

# pour lire un $octet en $i dans $str
my $octet = ord substr($str, $i, 1);
# pour écrire $octet en $i dans $str
substr($str, $i, 1, chr $octet);

Cette solution fonctionne bien si la chaîne ne contient pas de 'wide'
caractères (des caractères sur plusieurs octets) et si $octet est
compris entre 0 et 255. En fait, ça fonctionne aussi avec des valeurs
plus grandes mais dans ce cas on traite une chaîne de caractères
(unicode) et non une chaîne d'octets.

2- On peut aussi utiliser 'vec' :

# pour lire un $octet en $i dans $str
my $octet = vec($str, $i, 8);
# pour écrire $octet en $i dans $str
vec($str, $i, 8) = $octet;

Cette seconde solution fonctionne quelle que soit la nature du contenu
de $str. Et si $octet est en dehors de [0,255], c'est la valeur
($octet & 255) qui est affectée.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>