阅读与阅读在列表中存储输入,在TCL / TK脚本中反转列表顺序

时间:2016-07-14 01:08:20

标签: scripting tcl tk

我试图从输入中读取整数然后将其放入列表中。

之后,反转整数并显示该列表的反转顺序。

问题:所有输入都没有存储在列表中。

我想让它在一行中读取多个整数并存储每行读取一个整数的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

2 个答案:

答案 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)appendbreakgetsifllengthlmap (for Tcl 8.5)lmaplreverseprocreturnsetsplitstringwhile