(a changé ma réponse: j'étais un peu irritable, désolé.)
Si le texte à traiter est une variable appelée data
, on peut transformer le texte en une liste de mots et de passer par les trois à un moment comme celui-ci:
set result ""
foreach {keyword op value} [split [string trim $data]] {
append result "$keyword $op [incr value]\n"
}
dans ce cas, chaque mot-clé (principal, Bgp, sauvegarde, ...) se termine à l'intérieur de la variable de boucle keyword
, chaque signe égal (ou tout ce qui est dans la deuxième position) finit dans la variable de boucle op
, et chaque valeur doit être dans crémenté se termine à l'intérieur value
.
(Lorsque le fractionnement, il est généralement une bonne idée de couper l'espace blanc au début et à la fin du texte premier: sinon on peut obtenir des éléments « fantômes » vides où:. split [string trim $data]
)
Nous pouvons lire les données du fichier « datafile » comme ceci:
set f [open datafile r+]
set data [read $f]
Notez que nous utilisons r+
pour pouvoir à la fois lire et écrire dans le fichier.
Une fois que nous avons traité les données, nous pouvons écrire de nouveau au début du fichier comme ceci:
seek $f 0
puts -nonewline $f $result
close $f
ou peut-être comme celui-ci, ce qui signifie que nous ne devions pas ouvrir le fichier avec r+
:
close $f
set f [open datafile w]
puts -nonewline $f $result
close $f
Constituer:
set f [open datafile r+]
set data [read $f]
set result ""
foreach {keyword op value} [split [string trim $data]] {
append result "$keyword $op [incr value]\n"
}
seek $f 0
puts -nonewline $f $result
close $f
Cette procedu re peut également être simplifié un peu en utilisant le paquet standard fileutil
, qui peut s'occuper de l'ouverture, de la fermeture, de la lecture et de l'écriture des fichiers pour nous.
D'abord, nous avons mis le traitement dans une procédure:
proc process data {
foreach {keyword = value} [split [string trim $data]] {
append result "$keyword ${=} [incr value]\n"
}
return $result
}
nous pouvons alors demandez demander updateInPlace
de mettre à jour le contenu du fichier avec de nouveaux contenus traités par process
.
package require fileutil
::fileutil::updateInPlace datafile process
Et c'est tout.
Documentation: append, close, fileutil (package), foreach, incr, open, package, proc, puts, read, return, seek, set, split, string
Qu'avez-vous essayé? C'est un programme assez basique que vous devriez être capable de faire après avoir travaillé sur un simple tutoriel. –