Как искать подтекст в тексте в Tcl? - PullRequest
1 голос
/ 06 марта 2019

Я новичок в tcl, у меня есть список 1-adam 2-john 3-mark, и я должен взять ввод для пользователя, какой серийный номер я должен изменить в списке, и сделать его списком 1-adam 2-john 3-jane, когда пользователь хочет изменить серийный номер 3?

Я пытался это:

set names [split "1-adam 2-john 3-mark" " "]
puts "Enter the serial no:" 
set serial [gets stdin]
set needle $serial\-
foreach name $names {
    #here I'm trying to find  and overwrite'
}

1 Ответ

2 голосов
/ 06 марта 2019

У вас хорошее начало.Чтобы заменить элемент в списке, вы обычно можете использовать lreplace, а для этого конкретного случая также lset.Обе функции нуждаются в индексе заменяемого элемента, и поэтому я рекомендовал бы использовать цикл for вместо foreach:

set names [split "1-adam 2-john 3-mark" " "]
puts "Enter the serial no:"
set serial [gets stdin]
puts "Enter new name:"     ;# Might want to add something like this for the new name
set new_name [gets stdin]
set needle $serial-        ;# You do not really need to escape the dash
for {set i 0} {$i < [llength $names]} {incr i} {
    set name [lindex $names $i]
    if {[string match $needle* $name]} {
        set names [lreplace $names $i $i $needle$new_name]
    }
}
puts $names
# 1-adam 2-john 3-jane

Использование lset будет:

lset names $i $needle$new_name

Другой способ сделать это - найти индекс элемента, который нужно изменить, с помощью lsearch, в этом случае вам не понадобится цикл:

set names [split "1-adam 2-john 3-mark" " "]
puts "Enter the serial no:"
set serial [gets stdin]
puts "Enter new name:"
set new_name [gets stdin]
set needle $serial-

set index [lsearch $names $needle*]
if {$index > -1} {
    lset names $index $needle$new_name
} else {
    puts "No such serial in the list!"
}

puts $names
# 1-adam 2-john 3-jane
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...