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

split perturbant

9 réponses
Avatar
Fabrice L.
Re bonjour,

Je n'arrive pas a splitter correctement une variable

$var = "Durand Paul";

et je veux splitter le tout pour avoir d'un coté le nom de l'autre le
prenom.
Cependant, ce qui separe les deux mots n'est pas toujours un espace, cela
peut etre 2 espaces ou 3, ou une tabulation, ou plusieurs tabulations.

($p1,$p2) = split(/\t/,$var); # ne fonctionne que pour le cas ou une
tabulation se trouve etre le séparateur.

J'ai essayé de mettre \s comme séparateur, qui comme l'indique le livre que
je possede '\s => Un espace, identique a [ \t\n\r\f ]' mais sans resultat
plus probant.

J'ai essayé aussi via une regexp de remplacer tous ce qui n'est pas un mot
(tabulation, espace) par quelque chose de commun (un espace dans mon cas) :

$var =~ s/\W/ /g;
($p1,$p2) = split(/ /,$var);

le probleme est que les accents et autre trait d'union sont aussi remplacé
par un espace... ca ne va donc pas.

Donc si kkun a une idée, ou peut me mettre sur la bonne voie, je suis
preneur.

merci

Fabrice

9 réponses

Avatar
Stephane Zuckerman
$var = "Durand Paul";

et je veux splitter le tout pour avoir d'un coté le nom de l'autre le
prenom.
Cependant, ce qui separe les deux mots n'est pas toujours un espace, cela
peut etre 2 espaces ou 3, ou une tabulation, ou plusieurs tabulations.

[...]

J'ai essayé de mettre s comme séparateur, qui comme l'indique le livre que
je possede 's => Un espace, identique a [ tnrf ]' mais sans resultat
plus probant.


Pourtant c'est exactement cela qu'il faut utiliser. Ou alors, le caractère
qui sépare le prénom et le nom n'est pas contenu dans s.

Donc moi je dirais
use strict;
use warnings;

my $var = "Durand Paul";
my @prenom_nom = split( m{s}, $var );
print join('#', @prenom_nom), "n"; # histoire de montrer que ça marche ;)

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
nicolas
Le Tue, 19 Jul 2005 16:44:03 +0200
"Fabrice L." a écrit:

Re bonjour,

Je n'arrive pas a splitter correctement une variable

$var = "Durand Paul";

et je veux splitter le tout pour avoir d'un coté le nom de l'autre le
prenom.
Cependant, ce qui separe les deux mots n'est pas toujours un espace, cela
peut etre 2 espaces ou 3, ou une tabulation, ou plusieurs tabulations.



$var =~ /^(w+)s+(w+)$/;
my ($p1,$p2) = ($1,$2);

perldoc perlre

J'espère que ça suffit.

--
nicolas //

Avatar
nicolas

$var =~ /^(w+)s+(w+)$/;
my ($p1,$p2) = ($1,$2);


encore plus propre:

my ($p1,$p2) = $var =~ /^(w+)s+(w+)$/;




--
nicolas //

Avatar
Fabrice L.
"Stephane Zuckerman" a écrit dans le message de
news:
$var = "Durand Paul";
[...]


J'ai essayé de mettre s comme séparateur, qui comme l'indique le livre
que


je possede 's => Un espace, identique a [ tnrf ]' mais sans
resultat


plus probant.


Pourtant c'est exactement cela qu'il faut utiliser. Ou alors, le caractère
qui sépare le prénom et le nom n'est pas contenu dans s.


la solution est donc la, le caractere qui separe le nom prénom n'est pas
dans s car votre solution fonctionne sur certains couples nom/prenom mais
pas sur tous.
donc si le caractere qui separe nom prenom, n'est pas un espace, une
tabulation mais s'affiche a l'ecran comme un espace, qu'est ce ?


Avatar
Stephane Zuckerman
la solution est donc la, le caractere qui separe le nom prénom n'est pas
dans s car votre solution fonctionne sur certains couples nom/prenom mais
pas sur tous.
donc si le caractere qui separe nom prenom, n'est pas un espace, une
tabulation mais s'affiche a l'ecran comme un espace, qu'est ce ?
Plusieurs espaces ? :-)

Peut-être votre variable contient-elle plusieurs lignes ? (auquel cas il
faut rajouter des flags à la fin de la regexp de votre split - 's' je
crois).

Bref, peut-être faut-il plutôt faire un

my @nom_prenom = split(s{s+}, $var);

--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Stephane Zuckerman
Bref, peut-être faut-il plutôt faire un

my @nom_prenom = split(s{s+}, $var);
Oooops, il fallait lire

my @nom_prenom = split(m{s+}s, $var);
Bien sûr.
--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Paul Gaborit
À (at) Tue, 19 Jul 2005 17:06:39 +0200,
Stephane Zuckerman écrivait (wrote):
[...]
J'ai essayé de mettre s comme séparateur, qui comme l'indique le livre que
je possede 's => Un espace, identique a [ tnrf ]' mais sans resultat
plus probant.


Pourtant c'est exactement cela qu'il faut utiliser. Ou alors, le caractère
qui sépare le prénom et le nom n'est pas contenu dans s.
[...]

my $var = "Durand Paul";
my @prenom_nom = split( m{s}, $var );


Mais il peut y avoir un ou plusieurs espaces (ou tabulation, blancs,
etc.)... Donc :

my @prenom_nom = split /s+/, $var;

Avec quelques réserves car un nom et un prénom peuvent être composés
de plusieurs mots (sans traits d'union) et dans ce cas le split va
découper en plus de deux morceaux . Il y a d'ailleurs des cas
indécidables même par un humain. Il y a même des pays où la notion de
nom et de prénom n'existent pas vraiment...

PS: pour pouvoir utiliser correctement w (et W) avec des accents ou
d'autres caractères hors ASCII, il faut utiliser les 'locale' ou
unicode. Cf. perldoc perllocale ou perldoc perlunicode.

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


Avatar
Fabrice L.
ne fonctionne pas ... erreur 500


my @nom_prenom = split(s{s+}, $var);



et la variable ne fait pas plusieurs lignes, dumoins a l'affichage ecran
tout est sur la meme ligne.
Chose étonnante, j'ai copié coller le fameux espace tel quel dans le split
et ca fonctionne... maintenant quel est ce caractere j'en sais fichtre
rien...

Fabrice

Avatar
Paul Gaborit
À (at) Tue, 19 Jul 2005 17:32:47 +0200,
"Fabrice L." écrivait (wrote):
et la variable ne fait pas plusieurs lignes, dumoins a l'affichage ecran
tout est sur la meme ligne.
Chose étonnante, j'ai copié coller le fameux espace tel quel dans le split
et ca fonctionne... maintenant quel est ce caractere j'en sais fichtre
rien...


s matche tous les blancs ASCII. Peut-être avez-vous un espace
insécable codé en ??? (latin1, utf-8, ansinew... selon vos règlages).

Passez la ligne 'bizarre' dans 'od -xc' si vous êtes sur un unix. Ou
passez là dans le script suivant :

----------------------------------------
my $var = "ligne bizarre"; # avec un blanc non-identifié

foreach my $car (split //, $var) {
print ord($car), ": |$car|n";
}
----------------------------------------

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