TCL:找到列表中的第一个数字?

TCL: Find first number in list?

使用列表,是否可以找到列表中的第一个值? (不使用明显的 foreach item> $list 循环)

例如我有一个列表 {23dsf} { } {2a} {255} {gsd3fs} {fg'dslk23} {...}

我正在查看 lsearch -integer,但这需要确定数字是什么 :(

我需要简单地识别第一个数值,即 255 (lindex 3)

我只想使用 foreach 循环,但如果你 真的 不想,好吧,递归只是换了一种循环:

#!/usr/bin/env tclsh
package require Tcl 8.6

proc firstint {lst} {
   if {[llength $lst]} {
      set first [lindex $lst 0]
      if {[string is integer -strict $first]} {
         return $first
      } else {
         tailcall firstint [lrange $lst 1 end]
      }
   }
}

set lst [list {23dsf} { } {2a} {255} {gsd3fs} {fg'dslk23} {...}]
puts [firstint $lst]

这里有一个one-liner,用lmap过滤掉non-integers,然后只取剩下的第一个元素:

(bin) 9 % set lst [list {23dsf} { } {2a} {255} {gsd3fs} {fg'dslk23} {...} 42]
23dsf { } 2a 255 gsd3fs fg'dslk23 ... 42
(bin) 10 % lindex [lmap i $lst {expr {[string is integer -strict $i] ? $i : [continue]}}] 0
255

使用评论中指出的 lsearch -regexp

给定列表:

set lst {{23dsf} { } {2a} {255} {gsd3fs} {fg'dslk23} {...}}

lsearch -regexp $lst {^\d+$}

或其等效物

lsearch -regexp $lst {^[[:digit:]]+$}

Return 列表中第一个数值的索引 (3)。