#list #tcl
#Список #tcl
Вопрос:
Я новичок в tcl, у меня есть список 1-adam 2-john 3-mark
, и я должен ввести для пользователя, какой серийный номер я должен изменить в списке, и внести его в список 1-adam 2-john 3-jane
, когда пользователь захочет изменить serial 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. У меня нет подключения к Интернету к ПК, поэтому я использую свой телефон, чтобы задавать и набирать вопросы
3. И спасибо, что помогли мне
Ответ №1:
У вас хорошее начало. Для замены элемента в списке обычно можно использовать 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
Комментарии:
1. После замены имени вы могли
break
выполнить цикл.