en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"
comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
1/ la regexp s+ matche au moins un espace, et le maximum possible. 2/ split permet de couper une chaine selon des regexps 3/ join permet de recoller une liste.
Il y a plusieurs facons d'enlever un eventuel espace initial.
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"
comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)
1/ la regexp s+ matche au moins un espace, et le maximum possible.
2/ split permet de couper une chaine selon des regexps
3/ join permet de recoller une liste.
Il y a plusieurs facons d'enlever un eventuel espace initial.
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
1/ la regexp s+ matche au moins un espace, et le maximum possible. 2/ split permet de couper une chaine selon des regexps 3/ join permet de recoller une liste.
Il y a plusieurs facons d'enlever un eventuel espace initial.
La lecture de la doc de split est à conseiller quand on écrit des trucs comme ça :
As a special case, specifying a PATTERN of space (' ') will split on white space just as "split" with no arguments does. Thus, "split(' ')" can be used to emulate awk's default behavior, whereas "split(/ /)" will give you as many null initial fields as there are leading spaces. A "split" on "/s+/" is like a "split(' ')" except that any leading whitespace produces a null first field. A "split" with no arguments really does a "split(' ', $_)" internally.
Marc Espie wrote in message <g1b6o1$1rsc$1@biggoron.nerim.net>:
La lecture de la doc de split est à conseiller quand on écrit des trucs
comme ça :
As a special case, specifying a PATTERN of space (' ') will
split on white space just as "split" with no arguments does.
Thus, "split(' ')" can be used to emulate awk's default
behavior, whereas "split(/ /)" will give you as many null
initial fields as there are leading spaces. A "split" on
"/s+/" is like a "split(' ')" except that any leading
whitespace produces a null first field. A "split" with no
arguments really does a "split(' ', $_)" internally.
La lecture de la doc de split est à conseiller quand on écrit des trucs comme ça :
As a special case, specifying a PATTERN of space (' ') will split on white space just as "split" with no arguments does. Thus, "split(' ')" can be used to emulate awk's default behavior, whereas "split(/ /)" will give you as many null initial fields as there are leading spaces. A "split" on "/s+/" is like a "split(' ')" except that any leading whitespace produces a null first field. A "split" with no arguments really does a "split(' ', $_)" internally.
Paul Gaborit
À (at) Sun, 25 May 2008 07:13:59 +0200, Mag écrivait (wrote):
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
Le mieux serait de lire la doc de 'split' et de 'join'. Mais il se trouve que 'split' avec ses réglages par défaut fait exactement ce que vous souhaitez. Ça peut donc donner cela (en supposant que $line contient la ligne à traiter) :
$line = join(";", split $line);
ou :
$line = join(";", (split $line), "n");
(pour garder le "n" en fin de ligne.)
On peut aussi passer par des susbstitutions :
$line =~ s/^s*//; # suppression des espaces au début $line =~ s/s*$//; # suppression des espaces à la fin $line =~ s/s+/;/g; # remplacement des espaces par ;
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) Sun, 25 May 2008 07:13:59 +0200,
Mag <mag@laposte.net> écrivait (wrote):
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"
comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier
caractere de la ligne)
Le mieux serait de lire la doc de 'split' et de 'join'. Mais il se
trouve que 'split' avec ses réglages par défaut fait exactement ce que
vous souhaitez. Ça peut donc donner cela (en supposant que $line
contient la ligne à traiter) :
$line = join(";", split $line);
ou :
$line = join(";", (split $line), "n");
(pour garder le "n" en fin de ligne.)
On peut aussi passer par des susbstitutions :
$line =~ s/^s*//; # suppression des espaces au début
$line =~ s/s*$//; # suppression des espaces à la fin
$line =~ s/s+/;/g; # remplacement des espaces par ;
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
Le mieux serait de lire la doc de 'split' et de 'join'. Mais il se trouve que 'split' avec ses réglages par défaut fait exactement ce que vous souhaitez. Ça peut donc donner cela (en supposant que $line contient la ligne à traiter) :
$line = join(";", split $line);
ou :
$line = join(";", (split $line), "n");
(pour garder le "n" en fin de ligne.)
On peut aussi passer par des susbstitutions :
$line =~ s/^s*//; # suppression des espaces au début $line =~ s/s*$//; # suppression des espaces à la fin $line =~ s/s+/;/g; # remplacement des espaces par ;
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est
pas "fixe"
comment obtenir un:
192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d
sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un
espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere
de la ligne)
en gros l'espace entre l'ip et le 4 ainsi que les autres champs n'est pas "fixe"
comment obtenir un: 192.168.10.2;4;5500;2050682;257839;63672463;0;0;6w4d sachant aussi que si l'ip commence par 92 au lieu de 192, il y a un espace qui remplace le "1" (le 9 ne se retrouve pas en premier caractere de la ligne)
Mag
heu, et pourquoi pas un truc du genre :
join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));
Cordialement, Ezechiel
Paul Gaborit
À (at) Mon, 26 May 2008 10:05:35 +0200, Ezechiel écrivait (wrote):
heu, et pourquoi pas un truc du genre :
join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));
C'est une autre approche où on considère que chaque champ est représenté par un nombre de caractères fixe.
Mais elle présente deux inconvénients à mes yeux :
1- elle ne supprime pas les blancs inutiles (ça peut se corriger facilement).
2- ce genre d'affichage est généralement créé par un appel à printf avec des %Ns où N est la taille de chaque champ. Mais le N est une taille *minimum* et printf risque d'afficher plus de N caractères si le champ en a besoin. Et donc, la taille fixe ne sera plus respectée. Je ne sais pas si ça peut réellement arrivé dans ce cas précis mais je m'en méfie toujours...
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>
À (at) Mon, 26 May 2008 10:05:35 +0200,
Ezechiel <ezechiel_at_googoth_dot_com@aol.com> écrivait (wrote):
heu, et pourquoi pas un truc du genre :
join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));
C'est une autre approche où on considère que chaque champ est
représenté par un nombre de caractères fixe.
Mais elle présente deux inconvénients à mes yeux :
1- elle ne supprime pas les blancs inutiles (ça peut se corriger
facilement).
2- ce genre d'affichage est généralement créé par un appel à printf
avec des %Ns où N est la taille de chaque champ. Mais le N est une
taille *minimum* et printf risque d'afficher plus de N caractères si
le champ en a besoin. Et donc, la taille fixe ne sera plus respectée.
Je ne sais pas si ça peut réellement arrivé dans ce cas précis mais je
m'en méfie toujours...
--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>
À (at) Mon, 26 May 2008 10:05:35 +0200, Ezechiel écrivait (wrote):
heu, et pourquoi pas un truc du genre :
join(';', unpack("A15A3A7A8A8A9A5A5A5", $_));
C'est une autre approche où on considère que chaque champ est représenté par un nombre de caractères fixe.
Mais elle présente deux inconvénients à mes yeux :
1- elle ne supprime pas les blancs inutiles (ça peut se corriger facilement).
2- ce genre d'affichage est généralement créé par un appel à printf avec des %Ns où N est la taille de chaque champ. Mais le N est une taille *minimum* et printf risque d'afficher plus de N caractères si le champ en a besoin. Et donc, la taille fixe ne sera plus respectée. Je ne sais pas si ça peut réellement arrivé dans ce cas précis mais je m'en méfie toujours...
-- Paul Gaborit - <http://perso.enstimac.fr/~gaborit/> Perl en français - <http://perl.enstimac.fr/>