2012-04-15 11 views
6

Tôi cần một số trợ giúp trong việc xác định mảng và hiển thị và lặp lại chúng trong TCL.xác định và lặp qua các mảng tcl

Đây là cách tôi sẽ thực hiện chúng trong 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]; 
} 

Tôi muốn làm tương tự với tcl.Đây có phải là mã sau thích hợp không?

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

Tôi cũng có thể xác định đặt $ date làm mảng. Một số giống như:

set date array(); 

Vì vậy, tôi thay đổi nội dung mã của tôi đã thử một thử nghiệm đơn giản sử dụng thực hiện mảng RSeeger của:

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

doesnt trên trở lại bất cứ điều gì có lẽ là một số lỗi. Tôi cũng đã thử: đặt $ date ($ key) không có dấu ngoặc kép nhưng điều đó không hoạt động.

+2

Bạn sẽ được hưởng lợi từ [Tcl hướng dẫn] (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html) –

+1

Vấn đề với đoạn mã cuối cùng của bạn là nó thiếu một khoảng trống giữa '[mảng tên ngày tháng]' và '{'. Không gian đó là ** đáng kể ** trong Tcl! Nó phân tách thứ được lặp lại (nội dung mảng được tuần tự hóa) từ kịch bản lệnh để thực hiện cho mỗi lần lặp. Nói chung, với Tcl bạn _must_ tách riêng các từ của bạn một cách chính xác; nó nhanh chóng trở thành bản chất thứ hai (và tôi có xu hướng làm điều tương tự bây giờ trong nhiều ngôn ngữ khác nữa, vì khoảng trắng thừa tăng khả năng đọc gần như ở khắp mọi nơi, miễn là nó có ngữ nghĩa hợp pháp). –

Trả lời

8

Nếu bạn muốn lập chỉ mục mọi thứ theo số (mã của bạn ngụ ý), hãy sử dụng số list. Nó tương tự như một mảng trong 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]" 
} 

Nếu bạn muốn đánh chỉ mục thứ bằng chuỗi (hoặc có một danh sách thưa thớt), bạn có thể sử dụng một array, mà là một hashmap giá trị Key->.

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

Cảm ơn @RHSeeger. Tôi đã thử một trong các phương pháp của bạn nhưng nó không hoạt động. xem chỉnh sửa của tôi ở trên – Micheal

+0

không bao giờ bận tâm .. hoạt động của nó..cảm ơn tất cả! – Micheal

+0

Tôi vẫn nghĩ bạn nên sử dụng danh sách chứ không phải mảng. – RHSeeger

5

Trong Tcl, khái niệm mảng khác với nhiều ngôn ngữ lập trình khác và những gì Tcl gọi một mảng thường được gọi là bản đồ băm hoặc mảng liên kết ở nơi khác. Chỉ số mảng không giới hạn số nguyên nhưng có thể là bất kỳ chuỗi hợp pháp nào. Hầu hết thời gian tôi tìm thấy bản thân mình bằng cách sử dụng danh sách (hoặc danh sách các danh sách) thay vì mảng cho thao tác dữ liệu. Để lặp qua toàn bộ danh sách hoặc một mảng, bạn có thể sử dụng lệnh foreach.

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

Bạn không phải khởi tạo mảng trước khi đặt giá trị, chỉ cần bắt đầu thêm thành viên. thành viên mảng cá nhân được tham chiếu như

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

Không có mảng đa chiều trong Tcl, nhưng họ có thể được mô phỏng bằng cách có tên chính phù hợp, ví dụ

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

Khác hơn thế, tôi sẽ chỉ hướng bạn đến wiki Tcl chủ yếu xuất sắc và đó là array pagearray man page cho các vấn đề cú pháp vì tôi không thấy điểm lặp lại hầu hết nội dung của họ tại đây.

+1

Bạn có thể làm cấu trúc đa chiều bằng cách lồng danh sách; 'lindex' và' lset' có nhiều dạng chỉ mục riêng cho trường hợp này. Đối với trường hợp bạn cần loại điều đó, nó hoạt động tốt (và nó cũng nhanh). –

3

Các mảng TCL gần hơn với những gì Python gọi là dict và một băm trong Perl. Vì vậy, nó giúp chúng ta nghĩ của chỉ số như một keystring, chứ không phải là một số nguyên chỉ số:

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

Bạn có thể sử dụng array chức năng để làm những việc hữu ích, giống như tạo ra một danh sách của tất cả các phím, và bạn có thể lặp thông qua danh sách đó nếu bạn cần. Ví dụ, bạn có thể tạo danh sách các phím và sau đó sử dụng llength để nhận kích thước mảng.

Điều này hoạt động tốt nhất nếu bạn cần một chỉ mục duy nhất để tìm chúng. Nếu bạn chỉ cần một danh sách được sắp xếp - bạn có thể nên sử dụng các chức năng danh sách thực tế như lappend.

+0

vì vậy tôi đoán tôi sẽ làm điều đó theo một cách hơi khác so với cách tôi viết mã của mình ở trên .. – Micheal

+0

Như Edu đã đề cập - foreach thực sự rất hay để làm việc với danh sách, có khả năng nó có thể giúp cuộc sống của bạn dễ dàng hơn nếu danh sách phù hợp để giải quyết vấn đề của bạn. –

+0

tốt trong trường hợp này tôi cần mảng tương tự như mã đã đề cập ở trên .. Tôi không thấy danh sách phù hợp với tôi trong tình huống hiện tại của mình. – Micheal