我正在尝试从输入中读取整数,然后将其放入列表中。
之后,反转整数并显示该列表的相反顺序。
问题:所有输入都未存储在列表中。
我希望它在一行中读取许多整数并存储而不是每行读取一个整数。
法典:
#! /bin/env tclsh
set l1 {}
while 1 {
# reads input
set data [gets stdin]
# issue (reads only once per line)
# issue (want to make it read many integers in 1 line)
if {[eof stdin] || [scan $data "%d" myint] != 1} {
break
}
# adds input to list
lappend l1 $myint
}
set l2 {}
# make a list 2 with integers in REVERSED order
for {set i [llength $l1]} {$i >= 0} {incr i -1} {
lappend l2 [lindex $l1 $i]
}
# print both lists to compare
puts $l1
puts $l2
% proc getNum {} {
while 1 {
set data [gets stdin]
# Extracting only digits which are whole word
# i.e. 100 -> accepted
# i.e. 100a -> Not accepted
set numbers [regexp -all -inline {md+M} $data]
# If the list is empty, then break out of the loop
if {$numbers eq {}} {break}
append l1 "$numbers "
}
puts "Input : $l1"
# Using in-built command 'lreverse' to reverse the list elements
puts "Reversed : [lreverse $l1]"
}
% getNum
109 865 17 36
444 2019 56
8 19 test100 11
a
Input : 109 865 17 36 444 2019 56 8 19 11
Reversed : 11 19 8 56 2019 444 36 17 865 109
%
参考 : 反向
此命令可以从命令行参数或标准输入读取。
proc getNum args {
if {[llength $args] > 0} {
set data $args
} else {
while {[gets stdin line]} {
append input $line n
}
set data [split [string trim $input]]
}
set numbers [lmap item $data {
if {[string is integer -strict $item]} {
set item
} else {
break
}
}]
return [lreverse $numbers]
}
% getNum 1 2 3 4
# => 4 3 2 1
% getNum
1 2 3
4 5 6
789
# => 789 6 5 4 3 2 1
如果有参数,它会使用这些参数。否则,它会从输入中读取,将给定到文件末尾的所有行组合在一起,然后将文本拆分为一个列表。
然后,它会检查数据列表中是否存在与整数的字符串定义匹配的项目。签出的所有项目都将添加到结果列表中。一旦它找到整数以外的内容(或当数据列表结束时),它就会停止并返回以相反顺序找到的数字。
文档:>(操作员),附加破得到如果长度,lmap(对于Tcl 8.5),LMAP,l反向,过程,返回设置分裂字符串而