2016-07-14 7 views
0

Ich versuche ganze Zahlen aus der Eingabe zu lesen und dann in eine Liste zu schreiben.Eingabe in Liste lesen und speichern, Reihenfolge der Liste in TCL/TK-Skripten umkehren

Danach kehren Sie die Ganzzahlen um und zeigen die umgekehrte Reihenfolge dieser Liste an.

Problem: Alle Eingaben werden nicht in der Liste gespeichert.

Ich möchte es viele Ganzzahlen in einer Zeile lesen und INSTEAD von dem Lesen einer Ganzzahl pro Zeile speichern.

Code:

#! /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 

Antwort

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 
% 

Referenz:lreverse

+0

Dies wird die Eingabe '09' auch akzeptieren, für die Sie eine Schleife durch alle Elemente aus der letzten Liste und entfernen Sie es, indem Sie einfach mit dem char als '0'' String trimleft' tun. – Dinesh

+0

Um dies zu verwenden, gehe ich in den Tclsh-Modus und hinter den Code in. Gibt es eine Möglichkeit, ich kann es als "tclsh t.tcl" tun und haben den Eingabebefehl funktioniert? – geforce

+0

Auch wie würde ich GetNum {1,2,3,4} in einem Befehl tun können? Fügen Sie der getNum-Funktion ein Listenargument hinzu? – geforce

0

Dieser Befehl entweder über die Befehlszeilenargumente oder von der Standardeingabe lesen.

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 

Wenn es Argumente gibt, verwendet es diese. Andernfalls liest es aus der Eingabe, fügt alle bis zum Ende der Datei angegebenen Zeilen zusammen und teilt den Text in eine Liste auf.

Dann überprüft es die Datenliste auf Elemente, die der String-Definition einer Ganzzahl entsprechen. Alle auscheckenden Artikel werden zur Ergebnisliste hinzugefügt. Sobald es etwas anderes als eine Ganzzahl findet (oder wenn die Datenliste endet), stoppt es und gibt die gefundenen Zahlen in umgekehrter Reihenfolge zurück.

Dokumentation: > (operator), append, break, gets, if, llength, lmap (for Tcl 8.5), lmap, lreverse, proc, return, set, split, string, while

Verwandte Themen