我试图从输入中读取整数然后将其放入列表中。
之后,反转整数并显示该列表的反转顺序。
问题:所有输入都没有存储在列表中。
我想让它在一行中读取多个整数并存储每行读取一个整数的INSTEAD。
代码:
#! /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
答案 0 :(得分:0)
% 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 {\m\d+\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
%
参考: lreverse
答案 1 :(得分:0)
此命令可以从命令行参数或标准输入读取。
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
如果有参数,则使用它们。否则,它从输入中读取,汇集所有给定的文件末尾的行,然后将文本拆分为列表。
然后它检查数据列表中与整数的字符串定义匹配的项目。签出的所有项目都将添加到结果列表中。一旦找到除整数之外的其他内容(或数据列表结束时),它就会停止并返回以相反顺序找到的数字。
文档: > (operator), append, break, gets, if, llength, lmap (for Tcl 8.5), lmap, lreverse, proc, return, set, split, string, while