08/11/2008, 22:10
Bon, pour ton bonheur et parceque j'avais un peu de temps à perdre, je t'ai fais une fonction qui fait ce que tu recherches, je ne l'ai testée que brièvement, mais elle semble marcher. C'est documenter, si jamais ça t'intéresse.
Ca marche exactement comme [split], sauf que ça considère tous les caractères passés en paramètres comme un seul séparateur.
tcl
proc my_split {chaine chars} {
# Scinde une chaine en liste, les séparateurs de la liste sont les
# caractères donnés en arguments. Contrairement à [split] de Tcl,
# cette procédure split sur tous les caractères.
set chars_length [string length $chars]
set chaine_length [string length $chaine]
set i 0
set result [list]
while {$i < $chaine_length} {
# $current_chars_checked correspond aux X caractères à partir de la
# position actuelle, X étant la taille des chars sur lesquels splitter.
#
# Concrètement, on vérifie que les X prochains caractères sont un
# séparateur (spécifié dans $chars en paramètre)
set current_chars_checked [string range $chaine $i [expr {$i + $chars_length - 1}]]
set current_char [string index $chaine $i]
# Si c'est un séparateur, on ajoute $currentElement à la liste de sortie
# $currentElement est une variable qui contient les caractères qui sont
# lus, mais qui ne sont pas dans un séparateur.
if {$current_chars_checked eq $chars} {
# On initialise la variable pour éviter toute erreur, car si on a
# un séparateur dès le début, on a pas encore de lettres dans
# la variable $currentElement.
if {![info exists currentElement]} {
set currentElement ""
}
# On ajoute les derniers caractères lus avant d'avoir trouver le séparateur
# à la liste de sortie, puis on efface $currentElement, de cette façon
# les prochaines caractères lus qui ne sont pas un séparateur seront
# ajouté dans une variable $currentElement qui est vierge.
lappend result $currentElement
unset currentElement
# Enfin, on "saute" les X prochaines caractères puisque c'est un
# séparateur, notre boucle continuera donc juste après le séparateur.
incr i $chars_length
} else {
# Si on est pas un séparateur, on ajoute le caractère lu à $currentElement
append currentElement $current_char
# Puis on passe à la lettre suivante
incr i
}
}
# Il reste les derniers caractères lus dans $currentElement, on les ajoutent
# à la variable de résultat, sinon il manquera toujours le dernier élément
lappend result $currentElement
# Puis on retourne la liste finale !
return $result
}
Ca marche exactement comme [split], sauf que ça considère tous les caractères passés en paramètres comme un seul séparateur.