TCLリストから要素を削除する方法:
Googleで検索しましたが、組み込み関数はまだ見つかりませんでした。
set mylist {a b c}
puts $mylist
a b c
インデックスで削除
set mylist [lreplace $mylist 2 2]
puts $mylist
a b
値で削除
set idx [lsearch $mylist "b"]
set mylist [lreplace $mylist $idx $idx]
puts $mylist
a
要素を削除するもう1つの方法は、フィルターで除外することです。このTcl 8.5の手法は、リストから指定された要素のallを削除するという点で、他の場所で述べたlsearch
&lreplace
メソッドとは異なります。
set stripped [lsearch -inline -all -not -exact $inputList $elemToRemove]
ネストされたリストを検索することはしません。これは、Tclがデータ構造の理解にあまり労力を注いでいない結果です。 (ただし、サブリストの特定の要素を比較することで、-index
オプション。
要素 "b"を置き換えたいとしましょう:
% set L {a b c d}
a b c d
最初の要素1と最後の要素1を何も置き換えません。
% lreplace $L 1 1
a c d
regsub
は、リストから値を削除するのにも適している場合があります。
set mylist {a b c}
puts $mylist
a b c
regsub b $mylist "" mylist
puts $mylist
a c
llength $mylist
2
他の人がやったことをまとめただけ
proc _lremove {listName val {byval false}} {
upvar $listName list
if {$byval} {
set list [lsearch -all -inline -not $list $val]
} else {
set list [lreplace $list $val $val]
}
return $list
}
その後で呼び出します
Inline edit, list lappend
set output [list 1 2 3 20]
_lremove output 0
echo $output
>> 2 3 20
Set output like lreplace/lsearch
set output [list 1 2 3 20]
echo [_lremove output 0]
>> 2 3 20
Remove by value
set output [list 1 2 3 20]
echo [_lremove output 3 true]
>> 1 2 20
Remove by value with wildcar
set output [list 1 2 3 20]
echo [_lremove output "2*" true]
>> 1 3