2016-07-14 4 views
0

입력에서 정수를 읽고 목록에 넣으려고합니다.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 

답변

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

+0

이것은 당신이 최종 목록에서 모든 요소를 ​​통해 루프는 단순히 '0'으로 문자로'문자열 trimleft'을 수행하여 제거 할 수있는뿐만 아니라 입력을'09', 받아 들일 것입니다. – Dinesh

+0

이것을 사용하려면 tclsh 모드로 들어가서 코드를 입력하십시오. "tclsh t.tcl"로 할 수있는 방법이 있습니까? 입력 명령이 작동합니까? – geforce

+0

또한 어떻게 하나의 명령에서 getNum {1,2,3,4}을 수행 할 수 있습니까? getNum 함수에 목록 인수를 추가 하시겠습니까? – geforce

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, 012 3,, while