Dữliệu mảng vàdanhsáchMảng là gì? Mảng là một danhsách có thứ tự các dữliệu vô hớng. Mỗi phần tử của mảng đều là một biến vô hớng tách biệt với một giá trị vô hớng độc lập. Các giá trị này là đợc sắp thứ tự - tức là chúng có một trình tự đặc biệt từ phần tử thấp nhất đến cao nhất. Mảng có thể có bất kì số phần tử nào. Mảng nhỏ nhất không có phần tử nào, trong khi mảng lớn nhất thì có thể lấp kín toàn bộ bộ nhớ có sẵn. Một lần nữa, điều này lại đợc giữ hợp với triết lí của Perl về không có giới hạn không cần thiết nào. Biểu diễn hằng kí hiệu Một hằng kí hiệu mảng (cách thức bạn biểu diễn giá trị của một mảng bên trong chơng trình mình) là một danhsách các giá trị tách nhau bằng dấu phẩy và đợc bao trong dấu ngoặc tròn. Những giá trị này tạo nên các phần tử của danh sách. Chẳng hạn: (1,2,3) # mảng gồm ba giá trị 1, 2 và 3 (fred, 4.5) # hai giá trị, fred và 4.5 Các phần tử của mảng không nhất thiết là hằng - chúng có thể là biểu thức mà sẽ đợc tính mới lại mỗi lần hằng đợc sử dụng. Chẳng hạn: ($a, 17) # hai giá trị: giá trị hiện tại của $a, và 17 ($b+$c,$d+$e) # hai giá trị Mảng rỗng (mảng không có phần tử nào) đwjc biểu diễn bằng một cặp dấu ngoặc rỗng: () # mảng rỗng (không phần tử) Một phần tử của mảng có thể bao gồm toán tử cấu tử mảng, đợc chỉ ra bởi hai giá trị vô hớng tách nhau bởi hai dấu chấm liên tiếp. Toán tử này tạo ra một danhsách các giá trị bắt đầu tại giá trị vô hớng bên trái kéo cho tới gía trị vô hớng bên phải, mỗi lần tăng lên một. Chẳng hạn: (1 5) # giống nh (1, 2, ,3 ,4, 5) (1.2 5.2) # giống nh (1.2, 2.2, 3.2, 4.2, 5.2) (2 6,10,12) # giống nh (2,3,4,5,6,10,12) ($a $b) # phạm vi đợc xác định bởi giá trị hiện tại của $a và $b Nếu giá trị vô hớng bên phải bé hơn vô hớng bên trái thì sẽ tạo ra danhsách rỗng - bạn không thể đếm ngợc trật tự của các giá trị. Nếu giá trị cuối cùng không phải là toàn bộ số bớc trên giá trị ban đầu thì danhsách sẽ dừng chỉ ngay trớc giá trị tiếp mà sẽ vợt ra ngoài phạm vi: (1.3 6.1) # giống nh (1.3, 2.3, 3.3, 4.3, 5.3) Một cách dùng của hằng kí hiệu mảng là nh đối của toán tử print() đã đợc giới thiệu trớc đây. Các phần tử của danhsách này đợc in ra mà không có bất kì khoảng trống xen thêm vào: print (Câu trả lời là , $a, \n) ; # ba phần tử mảng hằng kí hiệu Câu lệnh này in ra Câu trả lời là, theo sau bởi một dấu cách, giá trị của $a, và dấu dòng mới. Ta hãy chuyển sang cách dùng khác cho hằng kí hiệu mảng. Biến Một biến mảng giữ một giá trị mảng riêng (không hay nhiều giá trị vô hớng). Các tên biến mảng là tơng tự với các tên biến vô hớng, chỉ khác kí tự khởi đầu, là một dấu @ chứ không phải là dấu đô la $. Chẳng hạn: @fred # biến mảng @fred @A_Very_Long_Array_Variable_Name @A_Very_Long_Array_Variable_Name_that_is_different Lu ý rằng biến mảng @fred là không có quan hệ gì theo bất kì cách nào với biến vô hớng $fred. Perl duy trì không gian tên tách biệt cho các kiểu đối tợng khác nhau. Giá trị của một biến mảng mà cha đợc gán là (), danhsách rỗng. Một biểu thức có thể tham khảo tới các biến mảng nh một tổng thể, hoặc nó có thể xem xét và thay đổi từng phần tử của mảng đó. Toán tử Các toán tử mảng hành động trên các mảng nh một tổng thể. Một số toán tử mảng có thể cho lại một giá trị mảng, mà có thể hoặc đợc dùng nh một giá trị cho toán tử mảng khác, hoặc đợc gán vào một biến mảng khác. Phép gán Có lẽ toán tử mảng quan trọng nhất là toán tử gán mảng, cho mảng một giá trị. Nó là dấu bằng, giống nh toán tử gán vô hớng. Perl xác định liệu phép gán có là phép gán vô hớng hay phép gán mảng bằng việc để ý xem liệu phép gán là cho biến vô h- ớng hay mảng * . Chẳng hạn: @fred = (1,2,3); # mảng fred nhận ba phần tử hằng kí hiệu @barney = @fred; # bây giờ đợc sao sang @barney Nếu một giá trị vô hớng đợc gán vào trong một biến mảng thì giá trị vô hớng trở * * Điều này áp dụng cho lvalue vô hớng hay mảng cũng nh các biến đơn thành phần tử duy nhất của mảng: @huh = 1; # 1 đợc đặt cho danhsách (1) một cách tự động Tên biến mảng có thể xuất hiện trong danhsách hằng kí hiệu mảng. Khi giá trị của danhsách đợc tính thì Perl thay thế tên biến mảng bằng giá trị hiện tại của mảng đó, giống vậy: @fred = (một, hai); @barney = (4,5,@fred, 6, 7); @barney trở thành (4,5,một,hai,6,7) @barney = (8, @barney); # đặt 8 vào trớc @barney @barney = (@barney, cuối); # và cuối là ở cuối # @barney bây giờ là (8,4,5,một,hai,6,7,cuối) Lu ý rằng các phần tử mảng đợc thêm vào đều ở cùng mức nh phần còn lại của hằng kí hiệu - một danhsách không thể chứa một danhsách khác nh một phần tử * . Nếu một mảng hằng kí hiệu chỉ chứa các tham khảo biến (không phải là biểu thức) thì mảng hằng kí hiệu ấy cũng có thể đợc xử lí nh một biến. Nói cách khác, một mảng hằng kí hiệu nh thế có thể đợc dùng ở vế bên trái của phép gán. Mỗi biến vô h- ớng trong mảng kí hiệu nhận một giá trị tơng ứng từ danhsách ở vế phải của phép gán. Chẳng hạn: ($a, $b, $c) = (1, 2, 3); # đặt 1 cho $a, 2 cho $b, 3 cho $c ($a, $b) = ($b, $a); # tráo đổi $a và $b ($d, @fred) = ($a, $b, $c); # đặt $a cho $d, và ($b,$c) cho @fred ($e,@fred) = @fred; # loại bỏ phần tử thứ nhất của @fred là $e # điều này làm cho @fred = ($c) và $e = $b Nếu số phần tử đợc gán không sánh đúng với số các biến để giữ các giá trị thì mọi giá trị vợt quá (ở vế phải của dấu bằng) đều im lặng bị loại bỏ, và bất kì biến vợt quá nào (ở vế trái của dấu bằng) đều đợc cho giá trị undef. Một biến mảng xuất hiện trong danhsáchmảng hằng kí hiệu đều phải ở cuối, vì biến mảng là tham lam, và nó tiêu thụ tất cả các giá trị còn lại. (Này, bạn có thể đặt các biến khác sau nó, nhng chúng sẽ chỉ nhận giá trị undef mà thôi.) Nếu một biến mảng đợc gán cho một biến vô hớng thì số đợc gán là chiều dài của mảng, nh trong: @fred = (4, 5, 6); # khởi đầu @fred $a = @fred; # $a nhận phần tử đầu tiên của @fred Chiều dài cũng đợc cho lại nếu một tên biến mảng đợc dùng trong hầu hết mọi chỗ mà một giá trị vô hớng đang đợc cần tới. (Trong mục dới đây có tên Hoàn cảnh * * Perl 5.0 cho phép một tham khảo danhsách là một phần tử danh sách, nhng đấy vẫn không phải là danhsách nh một phần tử danhsách vô hớng mảng, chúng ta sẽ thấy rằng điều này quả là đợc gọi nh vậy với việc dùng tên mảng trong hoàn cảnh vô hớng.) Chẳng hạn, để lấy giá trị bé hơn chiều dài mảng một đơn vị, bạn có thể dùng @fred-1, vì toán tử trừ vô hớng cần các vô hớng cho cả hai toán hạng của nó. Chú ý điều sau: $a = @fred; # $a nhận chiều dài của @fred ($a) = @fred; # $a nhận phần tử đầu tiên của @fred Phép gán đầu tiên là phép gán vô hớng, và do vậy @fred đợc đối xử nh một vô h- ớng, cho lại chiều dài của nó. Phép gán thứ hai là phép gán mảng (cho dù chỉ một giá trị là cần tới), và do vậy cho phần tử đầu tiên của @fred, im lặng bỏ đi tất cả phần còn lại. Giá trị của phép gán mảng là chính bản thân giá trị mảng, và có thể đợc xếp tầng nh bạn có thể làm với các phép gán vô hớng. Chẳng hạn: @fred = (@barney = (2,3,4)); # @fred và @barney nhận (2,3,4) @fred = @barney = (2,3,4); # cùng điều ấy Thâm nhập phần tử Cho tới nay, chúng ta vẫn xử lí mảng nh một tổng thể, thêm vào và bỏ bớt các giá trị bằng việc thực hiện gán mảng. Nhiều chơng trình có ích đã đợc xây dựng dùng mảng mà thậm chí chẳng thâm nhập vào phần tử mảng nào. Tuy nhiên, Perl cung cấp toán tử chỉ số truyền thống để tham khảo tới một phần tử mảng theo chỉ số. Với toán tử chỉ số mảng, các phần tử mảng đều đợc đánh số bằng việc dùng số nguyên tuần tự, bắt đầu từ không * và tăng lên một cho mỗi phần tử. Phần tử đầu tiên của mảng @fred mà đợc thâm nhập tới là $fred[0]. Chú ý rằng @ trên tên mảng trở thành $ trên tham khảo phần tử. Đó là vì việc tham khảo tới một phần tử của mảng xác định ra một biến vô hớng (một phần của mảng), mà có thể hoặc đợc gán cho, hoặc có giá trị hiện tại của nó đợc dùng trong một biểu thức, kiểu nh: @fred = (7,8,9); $b = $fred[0]; # đặt 7 vào $b (phần tử đầu tiên của @fred) $fred[0] = 5; # bây giờ @fred = (5,8,9) Cũng có thể thâm nhập tới các phần tử khác dễ tơng tự, nh trong: $c = $fred[1]; $ đặt 8 cho $c $fred[2]++; # tăng phần tử thứ ba của @fred $fred[1] += 4; # cộng 4 vào phần tử thứ hai ($fred[0], $fred[1]) = ($fred[1], $fred[0]); # tráo đổi hai phần tử đầu Việc thâm nhập vào một danhsách các phần tử từ cùng mảng (nh trong thí dụ * * Cũng có thể thay đổi giá trị chỉ số của phần tử đầ utiên thành một số nào đó khác (nh một) bằng việc đặt giá trị cho biến $[. Tuy nhiên, làm nh vậy có ảnh hởng toàn cục, mà có thể gây lẫn lộn ngời sẽ bảo trì chơng trình của bạn, và có thể làm tan vỡ chơng trình bạn nhận đợc từ ngời khác. Do vậy, chúng tôi khuyên bạn nên coi đây là một tính năng không nên dùng. cuối) đợc gọi là lát cắt, và thờng xuất hiện đến mức có một cách biểu diễn đặc biệt cho nó: @fred[0,1] # hệt nh ($fred[0], $fred[1]) @fred[0,1] = @fred[1,0] # tráo đổi hai phần tử đầu @fred[0,1,2] = @fred[1,1,1] # làm cho cả 3 phần tử giống phần tử thứ hai @fred[1,2] = (9,10); # đổi hai giá trị cuối thành 9 và 10 Chú ý rằng lát cắt này dùng tiền tố @ chứ không là $. Điều này là vì bạn đang tạo ra một biến mảng bằng việc chọn một phần của mảng chứ không phải là biến vô hớng chỉ thâm nhập vào một phần tử. Lát cắt cũng làm việc trên danhsách hằng kí hiệu, hay bất kì toán tử nào cho lại một giá trị danh sách: @who = (fred,barney,betty,wilma)[2,3] ; # giống nh @x = (fred,barney,betty,wilma); @who = @x[2,3] Các giá trị chỉ số trong những thí dụ này là các số nguyên hằng kí hiệu, nhng chỉ số cũng có thể là bất kì biểu thức nào cho lại một số, mà rồi đợc dùng để chọn phần tử thích hợp: @fred = (7,8,9); $a = 2; $b = $fred[$a]; # giống $fred[2], hay giá trị 9 $c = $fred[$a-1]; # $c nhận $fred[1], hay 8 ($c) = (7,8,9) [$a-1]; # cũng điều đó nhng dùng lát cắt Vậy chơng trình Perl có thể có việc thâm nhập mảng tơng tự nh các ngôn ngữ lập trình truyền thống. ý tởng này về việc dùng một biểu thức cho chỉ số cũng có tác dụng cho các lát cắt. Tuy nhiên bạn hãy nhớ rằng chỉ số cho lát cắt ;à một danhsách các giá trị, cho nên biểu thức này là một biểu thức mảng, thay vì là motọ biểu thức vô hớng. @fred = (7,8,9); # nh trong thí dụ trớc @barney = (2,1,0); @backfred = @fred[@barney]; # giống nh @fred[2,1,0], hay ($fred[2],$fred[1],$fred[0]), # hay (9,8,7) Nếu bạn thâm nhập vào một phần tử mảng bên ngoài hai đầu của mảng hiện tại (tức là một chỉ số bé hơn không hay lớn hơn chỉ số của phần tử cuối cùng), thì giá trị undef sẽ đợc cho lại mà không có lời cảnh báo. Chẳng hạn: @fred = (1,2,3); $barney = $fred[7]; # $barney bây giờ là undef Việc gán một giá trị bên ngoài đầu của mảng hiện tại sẽ tự động mở rộng mảng (cho một giá trị undef cho tất cả các giá trị trung gian, nếu có). Chẳng hạn: @fred = (1,2,3); $fred[3] = hi; # @fred bây giờ là (1,2,3,hi) $fred[6] = ho; # @fred bây giờ là (1,2,3,hi,undef,ho) Phép gán cho một phần tử mảng có chỉ số bé hơn không là lỗi định mệnh, vì nó có thể làm phát sinh kiểu cách lập trình rất xấu. Bạn có thể dùng $#fred để lấy giá trị chỉ số của phần tử cuối của @fred. (Điều này giống nh tham khảo vỏ C). Bạn thậm chí còn có thể gán vào trong giá trị này để làm thay đổi chiều dài hiển nhiên của @fred, làm cho nó to lên hay co lại, nhng điều đó nói chung là không cần thiết, vì mảng thờng to lên hay co lại một cách tự động. Các toán tử push() và pop() Một cách dùng thông dụng của mảng là nh một chồng thông tin, nơi những giá trị mới đợc thêm vào và lấy đi từ phía bên phải của danh sách. Những phép toán này th- ờng xuất hiện đến mức chúng có các hàm đặc biệt của riêng chúng: push(@mylist,$newvalue); # giống @mylist = (@mylist, $newvalue) $oldvalue = pop(@mylist); # lấy ra phần tử cuối của @mylist Toán tử pop() cho lại undef nếu đối của nó là danhsách rỗng, thay vì làm điều gì đó khác kiểu Perl nh phàn nàn hay sinh ra thông báo lỗi. Toán tử push() cũng chấp nhận một danhsách các giá trị cần đợc đẩy vào danh sách. Các giá trị đợc đẩy vào cuối của danh sách. Chẳng hạn: @mylist = (1,2,3); push(@mylist,4,5,6); # @mylist = (1,2,3,4,5,6) Chú ý rằng đối thứ nhất phải là một tên biến mảng * - đẩy vào và lấy ra sẽ không có nghĩa với danhsách hằng kí hiệu. Các toán tử shift() và unshift() Các toán tử push() và pop() làm mọi điều ở bên phải của danhsách (phần với chỉ số cao nhất). Tơng tự thế, các toán tử unshift() và shift() thực hiện những hành động t- ơng ứng về bên trái của một danhsách (phần với chỉ số thấp nhất). Sau đây là vài thí dụ: unshift(@fred,$a); # nh @fred = ($a,@fred); unshift(@fred,$a,$b,$c); # nh @fred = ($a, $b, $c, @fred); $x = shift(@fred); # nh ($x,@fred) = @fred; # với một số giá trị thực * * Trong thực tế, bạn có thể bỏ @ mặc dầu tôi nghe nói rằng Perl 5.0 lại đòi hỏi nó. @fred = (5,6,7); unshift(@fred,2,3,4); # @fred bây giờ là (2,3,4,5,6,7) $x = shift(@fred); # $x nhận 2, $fred nhận bây giờ là (3,4,5,6,7) Nh với pop(), shift() cho lại undef nếu biến mảng là rỗng. Toán tử reverse() Toán tử reverse() đảo ngợc trật tự các phần tử của đối của nó, cho lại danhsách kết quả. Chẳng hạn: @a = (7,8,9); @b = reverse(@a); # đặt $b giá trị (9,8,7) $b = reverse(7,8,9); # cũng việc ấy Chú ý rằng danhsách đối là không bị thay đổi - toán tử reverse() chỉ làm việc trên bản sao. Nếu bạn muốn đảo ngợc một mảng tại chỗ, thì bạn cần gán nó ngợc trở lại cho cùng biến: @b = reverse(@b); # đăth @b là đảo ngợc của chính nó Toán tử sort() Toán tử sort() lấy đối của nó và sắp xếp chúng dờng nh chúng tất cả đều là các xâu theo trật tự ASCII tăng dần. Nó cho lại danhsách đã sắp xếp, không làm thay đổi danhsách gốc. Chẳng hạn: @x = sort(small, medium, large); # @x nhận large, medium, small @y = (1,2,4,8,16,32,64); @y = sort(@y); # @y nhận 1, 16, 2, 32, 4, 64, 8 Chú ý rằng các số sắp xếp không xuất hiện theo thứ tự số, nhng theo giá trị xâu của từng số (1, 16, 2, 32, vân vân). Trong mục Sắp xếp nâng cao, ở Chơng 15, Việc biến đổi dữliệu khác, bạn sẽ học cách sắp xếp theo số, hoặc theo thứ tự giảm, hay theo kí tự thứ ba của từng xâu, hay bất kì phơng pháp nào khác mà bạn chọn. Toán tử chop() Toán tử chop() làm việc trên biến mảng cũng nh biến vô hớng. Mỗi phần tử của mảng đều có kí tự cuối bị bỏ đi. Điều này có thể là thuận tiện khi bạn đọc một danhsách các dòng nh các phần tử mảng tách bạch, và bạn muốn bỏ đi dấu dòng mới trong tất cả các dòng ngay lập tức. Chẳng hạn: @stuff = (hello\n, world\n, happy day); chop(@stuff); # @stuff bây giờ là (hello, world, happy day) Hoàn cảnh vô hớng vàmảng Nh bạn có thể thấy, từng toán tử đều đợc thết kế để hoạt động trên một số tổ hợp xác định các vô hớng hay mảng, và cho lại một vô hớng hay mảng. Nếu một toán tử trông đợi một toán hạng là vô hớng thì ta nói rằng toán hạng đó là đợc tính trong hoàn cảnh vô hớng. Tơng tự, nếu một toán hạng đang trông đợi một giá trị mảng thì ta nói rằng toán hạng đó là đợc tính trong hoàn cảnh mảng. Thông thờng, điều này là khá thông thờng. Nhng đôi khi bạn nhận đợc một thao tác hoàn toàn khác tuỳ theo liệu bạn đang trong hoàn cảnh vô hớng hay mảng. Chẳng hạn, @fred cho lại nội dung của mảng @fred trong hoàn cảnh mảng, nhng cho lại chiều dài của mảng đó trong hoàn cảnh vô hớng. Nhng sự tinh vi này sẽ đợc nhắc tới khi các toán tử đó đợc mô tả. Nếu bạn muốn buộc một biểu thức phải đợc tính trong hoàn cảnh vô hớng thì bạn có thể ghép nối một xâu không vào cho nó * . Chẳng hạn: @a = (x,y,z); print (Tôi thấy , @a, phần tử\n); # sai, sẽ in là xyz cho @a print (Tôi thấy ,.@a, phần tt\n); # đúng, in 3 cho @a Tại đây, chúng ta đã nối xâu không vào @a, làm nẩy sinh xâu 3, mà rồi trở thành một phần của danhsách cho print. Một giá trị vô hớng đợc dùng bên trong một hoàn cảnh mảng thì sẽ đợc coi nh mảng một phần tử. <STDIN> nh một mảng Một toán tử ta đã thấy trớc đây cũng cho giá trị khác tong hoàn cảnh mảng là <STDIN>. Nh đã mô tả trớc đây, <STDIN> cho dòng tiếp của cái vào trong hoàn cảnh vô hớng. Bây giờ, trong hoàn cảnh mảng, toán tử này cho lại tất cả phần dòng còn lại cho tới cuối tệp. Mỗi dòng đều đợc cho lại nh một phần tử tách bạch của danh sách. Chẳng hạn: @a = <STDIN>; # đọc cái vào chuẩn trong hoàn cảnh mảng Nếu một ngời chạy chơng trình này gõ vào ba dòng, rồi nhấn Control-D (để chỉ ra cuối tệp), thì mảng kết thúc với ba phần tử. Mỗi phần tử sẽ là một xâu mà kết thúc bằng môt jdấu dòng mới, tơng ứng với ba dòng có kết thúc là dấu dòng mới đã gõ vào. Xen lẫn biến mảng Giống nh các vô hớng, các giá trị mảng có thể đợc để xen lẫn trong xâu có nháy kép. Một phần tử riêng của một mảng sẽ đợc thay thế bởi giá trị của nó, giống nh: @fred = (hello, dolly); * * Bạn cũng có thể dùng toán tử scalar() nhng chúng ta sẽ không nói về điiều đó ở đây. $y = 2; $x = This is $fred[1]s place; # This is dollys place $x = This is $fred[$y-1]s place; # cũng câu ấy Chú ý rằng biểu thức chỉ số đợc tính nh một biểu thức thông thờng, dờng nh nó ở bên ngoài xâu. Nó không phải là biến đợc xen lẫn trớc hết. Nói cách khác, nếu $y chứa xâu 2*4 thì ta vẫn nói về phần tử 1, chứ không phải là 7, vì 2*4 xem nh một số (giá trị của $y đợc dùng trong biểu thức số) chỉ là 2 rõ. Nếu bạn muốn đặt sau một tham khảo biến vô hớng đơn dấu ngoặc vuông trái thì bạn cần định biên cho dấu ngoặc vuông để cho nó không đợc coi nh một phần của một tham khảo mảng, nh sau: @fred = (hello, dolly); # đặt giá trị cho @fred để kiểm thử $fred = right; # chúng ta đang định nói this is right[1] . $x = this is $fred[1]; # sai, cho this is dolly $x = this is ${fred}[1] ; # đúng (đợc bảo vệ bởi dấu ngoặc nhọn) $x = this is $fred [1]; # đúng (xâu khác) $x = this is $fred\[1]; # đúng (sổ chéo ngợc che dấu nó) Tơng tự, một danhsách các giá trị từ một biến mảng cũng có thể đợc xen lẫn. Việc xen lẫn đơn giản nhất là toàn bộ mảng, đợc chỉ ra bằng việc cho tên mảng (kể cả kí tự @ đứng đầu của nó). Trong trờng hợp này, các phần tử đợc xen lẫn theo trình tự với một dấu cách giữa chúng, nh trong: @fred = (a, bb, ccc, 1, 2, 3); $all = Now for @fred here!; # $all cho Now for a bb ccc 1 2 3 here! Bạn cũng có thể chọn ra một phần của mảng với lát cắt: @fred = (a, bb, ccc, 1,2,3); $all = Now for @fred[2,3] here!; # $all cho Now for ccc 1 here! $all = Now for @fred[@fred[4,5]] here!; # cũng thế Một lần nữa, bạn có thể dùng bất kì cơ chế nháy kép nào đã đợc mô tả trớc đây nếu bạn muốn đặt sau một tham khảo tên mảng bằng một hằng kí hiệu dấu ngoặc nhọn trái thay vì một biểu thức chỉ số. Bài tập Xem Phụ lục A về lời giải 1. Hãy viết một chơng trình đọc một danhsách các xâu và in ra danhsách theo thứ tự đảo ngợc. 1. Hãy viết một chơng trình đọc một số rồi một danhsách các xâu (tất cả đều trên các dòng tách biệt), rồi in một trong các dòng đó từ danhsách nh đợc lựa chọn bởi con số đó. 1. Hãy viết một chơng trình đọc một danhsách các xâu rồi cọn ra và in xâu ngẫu nhiên trong danhsách đó. Hãy chọn một phần tử ngẫu nhiên của @somearray , đặt srand; tại đầu chơng trình của bạn (điều này sẽ khởi đầu bộ sinh số ngẫu nhiên), và rồi dùng rand (@somearray) khi bạn cần một giá trị ngẫu nhiên giữa 0 và một số bé hơn chiều dài của @somearray. . Dữ liệu mảng và danh sách Mảng là gì? Mảng là một danh sách có thứ tự các dữ liệu vô hớng. Mỗi phần tử của mảng đều. Perl 5.0 cho phép một tham khảo danh sách là một phần tử danh sách, nhng đấy vẫn không phải là danh sách nh một phần tử danh sách vô hớng mảng, chúng ta