intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Learning Perl - Mảng băm

Chia sẻ: AJFGASKJHF SJHDB | Ngày: | Loại File: PDF | Số trang:4

134
lượt xem
11
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

1. 2. 3. 4. 5. Mảng băm Biến mảng băm Biểu diễn hằng ký hiệu cho mảng băm Các toán tử trên mảng băm Bài tập 5.1 Mảng băm Mảng băm c ũng tựa như mảng (kiểu danh sác h), trong đó nó là một tập c ác dữ liệu vô hướng, với c ác phần tử riêng được c họn ra bằng một giá trị chỉ số nào đó.

Chủ đề:
Lưu

Nội dung Text: Learning Perl - Mảng băm

  1. D iễn đàn tin học | Tutorial Room Mục lục «« C hương 4 »» C hương 6 Learning Perl - Chương 5: Mảng b ăm 1. Mảng băm 2. Biến mảng băm 3. Biểu diễn hằng ký hiệu cho mảng băm 4. Các t oán tử trên mảng băm 5. Bài t ập 5.1 Mảng băm Mảng băm c ũng tựa như mảng (kiểu danh sác h), trong đó nó là một tập c ác dữ liệu vô hướng, với c ác phần tử riêng được c họn ra bằng một giá trị chỉ số nào đó. Không giống mảng danh sách, giá trị c hỉ số của mảng băm không phải là số nguyên không âm nhỏ, mà thay vào đó là vô hướng tuỳ ý. Những vô hướng này (c òn gọi là khoá) được dùng về sau để tìm kiếm c ác giá trị từ mảng này. Các phần tử c ủa mảng băm không c ó thứ tự đặc biệt. Bạn hãy xem chúng tựa như bàn đầy những quân bài. Nửa trên c ủa c ác con bài là khoá, còn nửa dưới là giá t rị của c húng. Mỗi lần bạn đặt một giá trị vào trong mảng băm thì một c on bài mới lại được tạo ra. Về sau khi bạn muốn sửa đổi giá trị này, bạn c ho khoá, c òn Perl tìm ra đúng con bài. Cho nên, thực sự, trật tự c ủa c ác c on bài là không quan trọng. Trong thực tế, Perl c ất giữ c ác con bài (cặp khoá-giá trị) bên trong t heo một thứ tự đặc biệt để dễ dàng tìm ra một c on bài cụ thể, cho nên Perl không phải duyệt qua tất c ả c ác c ặp để tìm ra đúng c on bài. Bạn không thể kiểm soát được trật tự này. 5.2 Biến mảng băm Tên biến mảng băm mà một dấu phần trăm (%) theo sau bởi một chữ cái, theo sau nữa là không hay nhiều c hữ, c hữ số và dấu gạc h dưới. Nói c ách khác, phần đi sau dấu % giống hệt c ái mà chúng ta c ó cho tên biến vô hướng và biến mảng. Và tương tự, chẳng có quan hệ gì giữa $jerry, @jerry và %jerry cả. Thay vì tham khảo tới toàn bộ mảng băm, thông dụng hơn cả là ta tạo ra một mảng băm và truy c ập vào nó bằng c ác h tham khảo tới c ác phần tử c ủa nó. Mỗi phần t ử của mảng đều là một vô hướng tác h biệt, được truy c ập tới bởi một c hỉ mục vô hướng, gọi là khoá. Các phần tử c ủa mảng băm %jerry vậy được tham khảo đến bằng $jerry{$key} với $key là bất kì biểu thức vô hướng nào. Ta lại chú ý rằng việc truy c ập vào một phần tử c ủa mảng ta dùng ký hiệu $ c hứ không phải lả % để truy c ập vào toàn bộ mảng. Giống như với mảng danh sách, bạn c ó thể tạo ra những phần tử mới c ho mảng băm bằng việc gán c ho mảng một phần tử: $jerry{"aaa"} = "bbb"; # t ạo ra khoá "aaa" với giá trị "bbb" $jerry{234.5} = 456.7; # t ạo ra khoá "234.5", giá trị 456.7 Hai c âu lệnh này tạo ra hai phần tử trong mảng. Những tham khảo về sau tới c ùng những phần tử này (dùng c ùng khoá) sẽ cho lại giá trị được c ất giữ. print $jerry{"aaa"}; # in "bbb" $jerry{234.5} += 3; # $jerry{234.5} giờ mang giá trị 459.7 Việc tham khảo tới một phần tử không c ó sẵn sẽ trả về giá trị undef , giống như với mảng danh sách hay biến vô hướng không xác định. 5.3 Biểu diễn hằng kí hiệu cho mảng băm Bạn c ó thể muốn truy c ập vào mảng băm như một toàn thể, để hoặc khởi tạo giá trị c ho nó hay sao chép nó sang mảng băm khác . Perl không thực sự c ó biểu diễn hằng kí hiệu c ho mảng băm, c ho nên thay vì thế nó tháo rời mảng ra như một danh sác h. Mỗi c ặp phần tử trong danh sác h (mà bao giờ cũng phải c ó một số c hẵn phần tử) đều xác định ra một khoá và giá trị tương ứng c ủa nó. Biểu diễn tháo rời này c ó t hể được gán vào trong mảng băm khác , mà rồi sẽ tái tạo lại c ùng mảng băm. Nói c ác h khác :
  2. @jerry_list nhận ("aaa", "bbb", "234.5", 456.7) # @jerry_list = %jerry; t ạo ra %tom giống %jerry # %tom = @jerry_list; c ách nhanh hơn để làm c ùng việc đó # %tom = %jerry; t ạo ra %smooth giống như %jerry, từ c ác giá trị # %smooth = ("aaa", "bbb", "234.5", 456.7); hằng kí hiệu Trật tự của c ác c ặp khoá-giá trị là tuỳ ý trong các h biểu diễn tháo rời này, v à không thể kiểm soát được . Cho dù bạn c ó tráo đổi một số giá trị và tạo ra một mảng như một toàn thể thì danh sác h tháo rời thu được vẫn c ứ theo bất kì trật tự nào mà Perl đã tạo ra để thâm nhập hiệu quả vào c ác phần tử riêng. Bạn đừng bao giờ nên dựa trên bất kì trật tự đặc biệt nào. 5.4 Các toán tử trên mảng băm Sau đây là một số toán tử c ho mảng băm. 5.4.1 Toán tử keys() Toán tử keys(%tên_mảng) t rả về danh sác h c ác tất c ả c ác khoá hiện c ó trong mảng băm %tên_mảng. Nói c ách khác , nó tựa như c ác phần tử được đánh số lẻ (1, 3, 5...) c ủa danh sác h c ó được sau khi tháo rời %tên_mảng t hàn một mảng danh s ác h, và trong thực tế, c ho lại c húng theo trật tự đó. Nếu không có phần tử nào t rong mảng băm thì keys() t rả về một danh sác h rỗng. Chẳng hạn, bằng việc dùng mảng băm từ ví dụ trước : $jerry{"aaa"} = "bbb"; $jerry{234.5} = 456.7; @list = keys(%jerry); # @list = ("aaa", 234.5) hoặc (234.5, "aaa"), trật tự này ta không kiểm soát được Các dấu ngoặc là tuỳ c họn: keys %jerry c ũng tương t ự như keys(%jerry). # duyệt qua danh sác h c ác khoá c ủa %jerry foreach $key (key %jerry) { print "tại $key chúng ta có $jerry{$key}\n"; # in khoá và giá trị } Ví dụ này c ũng chỉ ra rằng c ác phần tử mảng băm có thể chen lẫn nhau trong c ác xâu nháy kép. Tuy nhiên bạn không thể xen lẫn toàn bộ mảng. Trong ngữ c ảnh vô hướng, toán tử keys() c ho lại số c ác phần tử (c ặp khoá-giá trị) trong mảng băm. Chẳng hạn, bạn c ó thể tìm ra liệu mảng băm c ó rỗng hay không: if (keys(%mang)) { # nếu keys() khác không: ...; # mảng là khác rỗng } # ... hoặc ... while (keys(%mang) < 10) { ...; # c ứ lặp chu trình khi ta c ó ít hơn 10 phần tử } 5.4.2 Toán tử values() Toán tử v alues(%tên_mảng) t rả về một danh sác h tất c ả các giá trị hiện tại c ủa %tên_mảng, theo cùng trật t ự như c ác khoá được toán tử keys(%tên_mảng) c ho lại. Như với keys(), c ác dấu ngoặc tròn là tuỳ c họn. Chẳng hạn: %lastname = (); # gán %lastname là rỗng $lastname("jerry"} = "flintstore"; $lastname{"tom"} = "rubble"; @lastname = values(%lastname); # lấy các giá t rị #Tại điểm này @lastname c hứa ("flintstore", "rubble") hoặc đảo ngược c ủa nó
  3. 5.4.4 Toán tử each() Nếu bạn muốn duyệt mọi phần tử c ủa toàn bộ mảng băm, thì bạn có thể dùng keys(), duyệt xét từng khoá được cho lại và nhận giá t rị tương ứng. Trong khi phương pháp này thường hay được dùng, một các h hiệu quả hơn là dùng each(%tên_mảng), toán tử này sẽ trả về c ặp khoá-giá trị như một danh sách hai phần tử. Với mỗi lần thực hiện t oán tử này cho c ùng mảng, c ặp khoá-giá trị kế tiếp sẽ được trả về, cho t ới khi tất c ả c ác phần tử đều đã được truy c ập. Khi không còn cặp nào nữa thì eac h() t rả về một danh sác h rỗng. Vậy c hẳng hạn, để duyệt qua toàn bộ mảng %lastname t rong vhí dụ trước , hãy làm điều gì đó tựa như thế này: while (($first, $last) = each(%lastname)) { print "First name of $first is $last\n"; } Việc gán một giá trị mới c ho toàn bộ mảng sẽ đặt lại từng toán tử each() t rở về vị trí bắt đầu (phần tử đầu tiên). Việc bổ s ung hay loại bỏ các phần tử của mảng thì rất c ó thể gây ra lẫn lộn eac h() (và c ó thể gây lẫn lộn cho cả bạn nữa). 5.4.5 Toán tử delete Cho đến giờ, với điều bạn biết được, bạn c ó thể thêm phần tử vào mảng băm, nhưng bạn không thể loại bỏ c húng (một việc khác hơn là gán giá trị mới cho toàn bộ mảng). Perl c ung cấp toán tử delete để loại bỏ c ác phần tử. Toán hạng c ủa delete là một tham khảo (tựa như c on trỏ trong C) đến mảng băm, hệt như nếu bạn c hỉ nhìn vào một giá trị đặc biệt. Perl loại bỏ c ặp khoá-giá trị khỏi mảng băm, và cho lại giá trị của phần tử bị xoá. Chẳng hạn: %jerry = ("aaa", "bbb", 234.5, 34.56); # c ho %jerry 2 phần tử # %jerry bây giờ c hỉ c òn một c ặp khoá-giá trị delete $jerry{"aaa"}; 5.4.6 Lát cắt mảng băm Tương tự như mảng danh sác h, mảng băm c ó thể được 'c ắt' thành từng phần nhỏ-tập hợp một số phần tử nào đó của mảng. Ví dụ, ta có thể tạo một mảng theo c ách sau: $score{"fred"} = 205; $score{"barney"} = 195; $score{"dino"} = 30; Trông c ó vẻ không được gọn gàng c ho lắm, ta c ó thể viết ngắn hơn như sau: ($score{"fred"}, $score{"barney"}, $score{"dino"}) = (205,195,30); Tuy nhiên ta thậm chí có thể viết ngắn hơn nữa dùng lát c ắt : @score{"fred", "barney", "dino"} = (205, 195, 30); Và đây nữa, ta c ó thể dùng lát c ắt trong xâu nháy kép: @players = ("fred", "barney", "dino"); print "scores are: @score{@players}\n"; Lát c ắt cũng c ó thể được dùng để ghép một mảng băm c on vào một mảng băm khác lớn hơn. Hãy xem ví dụ sau, mảng băm con được ưu tiên hơn: nếu c ó c ùng một khoá t ồn tại trong c ả mảng băm c on và mảng băm lớn thì giá trị trong mảng băm con sẽ được sử dụng: %league{keys %score} = value %score; Ở đây, mảng con %sc ore được ghép vào mảng lớn %league. Bạn c ũng có thể làm c ác h khác (chậm hơn): %league = (%league, %score); 5.5 Bài tập 1. Bạn hãy viết 1 c hương trình đọc vào một xâu rồi in ra xâu đó c ùng với giá t rị tương ứng với xâu
  4. đó theo bảng sau: Xâu Giá trị red apple green leaves blue ocean 2. Bạn hãy viết 1 c hương trình đọc vào một danh sác các từ, mỗi từ trên 1 dòng (quá trình nhập kết thúc khi c hương trình nhận được dấu hiệu end-of-file: kết thúc file). Sau đó in ra một bảng tổng kết xem mỗi từ xuất hiện bao nhiêu lần. Nâng c ao: hãy sắp xếp c ác từ theo thứ tự từ điển trước khi in ra kết quả. Mục lục «« C hương 4 »» C hương 6
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2