2012-04-15 2 views
6

배열을 정의하고 TCL에서 표시 및 반복하는 데 도움이 필요합니다.배열을 통해 정의하고 반복하기 TCL

여기 내가 어떻게 PHP에서 그들을 할 것입니다.

$date =array(); 
$size=0; 
$date[$size] =$pre_event_date; 
/* After doing some manpulation and calculations with $size */ 
for($i=0;$i<=$size;$i++){ 
    echo $date[$i]; 
} 

나는 다음과 같은 코드를 적절하게 사용하고 싶습니다.

set size 0 
set date[$size] $pre_event_date 
#After performing some manipulation 
for {set i 0} { $i <=$size } {incr i} { 
    puts "$date[$i]"; 
} 

또한 $ date를 배열로 정의 할 수 있습니다. 같은 같은 일부 :

set date(0) 35 
set date(1) 40 
foreach key [array names date]{ 
    puts "${key}=$date($key)" 
} 

위 나던 몇 가지 오류가 아마이 아무것도 반환 :

set date array(); 

그래서 난 내 코드 RSeeger의 배열의 구현을 사용하여 간단한 테스트를 시도 편집. 나는 또한 시도했다 : 따옴표없이 $ date ($ key)를 두지 만 그 중 어느 것도 작동하지 않는다.

+2

당신은 [티클 튜토리얼]에서 도움이 될 (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) –

+1

마지막 코드의 문제가 부족하다는 것입니다 '[배열 이름 날짜]'와'{'. 그 공간은 Tcl의 ** 중요 **입니다! 각 반복마다 스크립트에서 반복되는 객체 (일련 화 된 배열 내용)를 실행합니다. 일반적으로 Tcl을 사용하면 단어를 올바르게 구분해야합니다. 그것은 급격히 제 2의 천성이됩니다 (그리고 나는 많은 다른 언어에서도 똑같은 일을하는 경향이 있습니다, 의미 상으로는 합법적이라면 여분의 공백은 가독성을 거의 모든 곳에서 향상시킵니다). –

답변

8

번호 (코드에서 암시하는)로 색인을 생성하려면 list을 사용하십시오. 이것은 C의 배열과 유사합니다.당신이 문자열 색인 것을 원하는 (또는 스파 스 목록이있는) 경우

set mylist {} 
lappend mylist a 
lappend mylist b 
lappend mylist c 
lappend mylist d 
foreach elem $mylist { 
    puts $elem 
} 
// or if you really want to use for 
for {set i 0} {$i < [length $mylist]} {incr i} { 
    puts "${i}=[lindex $mylist $i]" 
} 

, 당신은 키 - > 값의 해시 맵을 인 array를 사용할 수 있습니다.

set myarr(chicken) animal 
set myarr(cows) animal 
set myarr(rock) mineral 
set myarr(pea) vegetable 

foreach key [array names myarr] { 
    puts "${key}=$myarr($key)" 
} 
+0

감사합니다. @RHSeeger. 나는 당신의 방법 중 하나를 시도했지만 그것이 작동하지 않습니다. 위의 나의 편집을 보아라 – Micheal

+0

결코 신경 쓰지 마라. 그 근무.. 모든 것 다시 한번! – Micheal

+0

아직도 배열을 사용하지 않고 목록을 사용하는 것이 더 나을 것이라고 생각합니다. – RHSeeger

5

Tcl에서는 배열 개념이 다른 많은 프로그래밍 언어와 다르며 Tcl이 배열이라고 부르는 것을 종종 해시 맵 또는 연관 배열이라고도합니다. 배열 인덱스는 정수로만 제한되지는 않지만 유효한 문자열 일 수 있습니다. 대부분의 경우 데이터 조작을 위해 배열 대신 목록 (또는 목록 목록)을 사용합니다. 전체 목록이나 배열을 반복 할 때 foreach 명령을 사용할 수 있습니다.

foreach {index content} [array get date] { 
    put $index: $content 
} 

값을 설정하기 전에 어레이를 초기화 할 필요는 없습니다. 멤버 추가를 시작하기 만하면됩니다. 개별 배열 구성원이 티클에는 다차원 배열이 없습니다

$array($key) or $array("abc") 

로 참조되지만,이보다

set a(1,1) 0 
set a(1,2) 1 
... 

다른 예를 들어, 일관된 키 이름을함으로써 시뮬레이션 할 수 있습니다 난 그냥 것 대부분 훌륭한 Tcl 위키를 가리키며, 대부분의 콘텐츠를 여기에서 반복해서 가리 키지는 못하므로 구문 문제에 대해서는 array pagearray man page입니다.

+1

중첩 목록을 사용하여 다차원 구조를 수행 할 수 있습니다. 'lindex'와'lset'은이 경우를 위해 특별히 다중 색인 형식을 가지고 있습니다. 당신이 그런 종류의 것을 필요로하는 경우에, 그것은 잘 작동합니다 (그리고 그것도 빠릅니다). –

3

TCL 배열은 파이썬이 dict라고 부르는 것, Perl에서 해시에 더 가깝습니다. 는 그래서 오히려 인덱스 정수보다는 keystring로 인덱스 생각하는 데 도움이 :

set groceries(fruit) "banana" 
set groceries(1) "banana" 

당신은 모든 키의 을 목록을 생성 같은 유용한 작업을 수행 할 array 기능을 사용할 수 있습니다, 당신은 반복 할 수 그 목록을 통해 필요한 경우. 예를 들어, 키 목록을 생성 한 다음 llength을 사용하여 배열 크기를 얻을 수 있습니다.

고유 색인을 찾으려면이 방법이 가장 효과적입니다. 주문한 목록이 필요한 경우 lappend과 같은 실제 목록 기능을 사용하는 것이 더 나을 것입니다.

+0

그래서 내가 위의 코드를 작성한 방법과 약간 다른 방식으로 할 것입니다. – Micheal

+0

Edu가 언급했듯이 - foreach는 목록 작업에 정말 좋습니다. 당신의 인생을 더 쉽게 만들 수있는 좋은 기회입니다 목록이 문제를 해결하는 데 적합한 지 여부 –

+0

이 경우에는 위에서 언급 한 코드와 비슷한 배열이 필요합니다. 현재 상황에서 저에게 적합한 목록을 보지 못합니다 .. – Micheal