II.Scalar variable. Trong khi một giá trị vô hướng (scalar) có thể thay đổi trong khi chương trình thực thi, thì một biến vô hướng không hề thay đổi. Tại một thời điểm một biến vô hướng chỉ có thể có một giá trị, nhưng giá trị đó có thể thay đổi theo sự đòi hỏi của chương trình. Một biến vô hướng sẽ có kiểu định dạng sau. $tên_biến một tên biến được kết thúc bằng khoảng trắng. Trong tên biến, vấn đế về chữ thường, chữ hoa là rất quan trọng. -ví dụ : biến %JAZZ là khác với biến $Jazz cũng như khác với biến $jazz Khi chọn tên cho một biến, ta nên chọn một tên sao cho sáng sủa, và nói lên được ý nghĩa, công dụng của biến vì việc lựa chọn những tên biến theo tiêu chuẩn trên sẽ giúp cho những người tham khảo chương trình của chúng ta hoặc là chính chúng ta sau này khi muốn đọc lại chương trình được dễ dàng. 1.Toán tử Chop. Toán tử này sẽ lấy một biến, bỏ đi ký tự cuối cùng và sau đó trả lại biến đã xử lý. Toán tử này được sử dụng nhiều trong những chương trình có sự tìm kiếm hoặc so sánh các chuỗi với nhau. chop( ). 2.Những chuỗi có chứa biến . Khi đọc thấy một chuỗi trong ngoặc kép, Perl sẽ tìm trong chuỗi đó xem có biến hay không. Nếu tìm thấy biến trong chuỗi ngoặc kép thì khi xuất chuỗi đó ra màn hình Perl sẽ thay tên biến đó bằng giá trị của nó. ví dụ: $ten= “A”; $ho_ten= “le van $ten”; sau 2 phép khai báo biến trên, khi xuất ra biến $ho_ten, ta sẽ được chuỗi “le van A”; nếu bạn muốn xuất tên của một biến mà không muốn xuất giá trị của nó thì bạn có 2 cách : hoặc là bạn để biến đó trong ngoặc đơn hoặc là bạn phải đặt một dấu “\” trước tên biến không muốn lấy giá trị. ví dụ: $ten= “A”; $ho_ten= “le van “.’ $ten’; hay $ho_ten =“le van \$ten” sau 2 phép gán trên thì ta sẽ thu được biến $ho_ten khi xuất ra là “le van $ten” 3.Đầu vào chuẩn <STDIN>. Trong Perl có một biến đặc biệt được gọi là đầu vào chuẩn hoặc là <STDIN>.Thực chất nó mang nhiều ý nghĩa hơn là ý nghĩa của một biến, nó là một filehandle.Trong Perl, ngoài <STDIN> ra, bạn còn có thể sử dụng một số filehandle khác như đầu ra chuẩn hay <STDOUT>, chuẩn lỗi hay <STDERR>. Filehandle là một cách cho phép Perl nhập / xuất cũng như tạo những kết nối giữa một chương trình đang chạy với một user. Một user có thể là một người hay là một quá trình nào khác. 4.Toán tử print. Toán tử này cho phép bạn sử dụng các giá trị và các biến. Khi bạn đặt những dữ liệu bạn cần vào trong script của bạn thì bạn cũng có thể lấy chúng ra. Các giá trị có thể thay đổi bên trong script của bạn trước khi bạn xuất nó ra một nơi được chỉ định, có thể là một script khác, một file , máy in, địa chỉ email hay màn hình người sử dụng. Chúng ta cũng có thể sử dụng <STDOUT> và toán tử print có liên kết với <STDOUT> để xuất dữ liệu. Perl sử dụng hàm print để đặt dữ liệu vào nơi mong muốn. Hàm print sẽ lấy một giá trị và đặt giá trị đó vào <STDOUT>. Hàm print cũng có thể được sử dụng để di chuyển một dãy danh sách các giá trị. Từ <STDOUT>, dữ liệu có thể được gửi đến những nơi được chỉ định như file, máy in, .v v 5.Giá trị không được định nghĩa. Nếu một biến mà không được chỉ định một giá trị nào thì nó không cần thiết cho script của bạn. Perl sẽ đặt cho những biến đó một giá trị undef, viết tắt của undefined nghĩa là không được định nghĩa, nó sẽ có giá trị là “0” nếu sử dụng nó như một số và khi xem nó như là một chuỗi thì nó sẽ là một chuỗi có chiều dài là “0”. Một điều đặc biệt của loại biến nay là khi đầu vào chuẩn đọc một file. Khi nó đọc và phát hiện một dòng trống hoặc là một chuỗi rỗng thì nó sẽ đổi thành một giá trị undef. Điều này có nghĩa là bạn sẽ phải tính toán đến những giá trị này khi có sự chuyển đổi trên. III.Dãy. Các dữ liệu vô hướng còn có thể chứa trong một danh sách có thứ tự mà chúng ta thường gọi là dãy. Một dãy được tạo thành từ những phần tử riêng biệt, những phần tử này lại là những biến riêng lẻ vàgiá trị của chúng. Những phần tử của một dãy được -2- đánh số thứ tự từ thấp đến cao (0 9 ). và một điều đặc biệt là một dãy thì không giới hạn số phần tử bên trong dãy . Các phần tử bên trong dãy có thể là ký tự, số hoặc một biến và cũng có thể là tất cả những loại trên. Một dãy thường có một trong những kiểu định dạng sau. (1,2,3); ($A,$B,$C,); ($A,1,$B,2,$C,3); Perl cho phép ta sử dụng một số danh sách có cấu trúc để tạo sự ngắn gọn khi liệt kê hay khai báo một dãy. ví dụ : dãy (1,2,3,4,5,6,7,8,9,10); sẽ được thay thế bằng dãy có cấu trúc sau (1 10); hoặc dãy (1,2,3,4,8,10); sẽ được thay bằng dãy (1 4,8,10); 1.Biến dãy. Ở phần trước, ta đã xét đến các loại biến mang giá trị là ký tự hoặc là số thì ở phần chúng ta sẽ xét đến biến dãy, một biến số thì được chỉ định bởi ký hiệu “$” thì một biến dãy được chỉ định bằng ký tự “@” ví dụ: @total,@date.v v Một biến dãy thì mang những đặc tính của dãy nên nó cũng không giới hạn số phần tử bên trong nó, và nếu ta lỡ đặt tên một biến vô hướng trùng tên của một biến dãy thì chúng vẫn không bị ảnh hưởng. Nếu một biến dãy là một dãy trống thì giá trị của nó sẽ là”null” hoặc là một danh sách rỗng và một biểu thức có thể thay đổi toàn bộ biến dãy hoặc chỉ một phần của biến dãy . 2.Toán tử dãy. Những toán tử của dãy cũng hoạt động như các toán tử của những biến thông thường, nó cũng sẽ trả về giá trị sau khi đã xử lý những thông tin vào. Sau đây là một số toán tử dãy mà ta cần lưu ý: push & pop shift & ubshift reverse sort chop -3- 2.1.Toán tử Assignment. Toán tử này cho phép đặt một giá trị vào trong một biến dãy. Nó cũng sử dụng ký hiệu giống như ký hiệu trong biến vô hướng, ký hiệu “=“được dùng để đưa vào giá trị biến. Một biến dãy có thể chứa một dãy khác bên trong nó ví dụ: @olduser = (“minh”,”dũng”); @newuser = (“thành”,”lê”,@olduser); @alluser = (@newuser,”tâm”,”hiếu”); dãy mà biến dãy alluser sẽ trả về là: thành, lê, minh, dũng, tâm, hiếu. Ta còn có thể gán 2 dãy với nhau như sau: +($F , $Y , $I) = (1,2,3) ta sẽ được : $F=1 , $Y=2 , $I=3. +($P, $C) = ($C , $P) sẽ trao đổi dữ liệu giữa biến C và biến P. +($P , @C) = ($F , $Y , $I) ta sẽ được: $P = $F và @C = ($Y , $I) sau đó, nếu ta lấy biến dãy C làm phép gán : ($A , @C) = @C thì ta sẽ được : phần tử thứ nhất của dãy C sẽ được truyền cho A $A = $Y @C = $I. Nếu ta gán một biến dãy với một biến vô hướng thì biến vô hướng sẽ mang giá trị là tổng số phần tử của dãy hoặc là chiều dài của dãy: + @A= (15,4,3,8,7); $A=@A; sau phép gán trên thì giá trị của biến vô hướng A sẽ là 5 (chiều dài của dãy A); + ($X) = @A; phép gán trên sẽ lấy giá trị của phần tử đầu tiên của dãy A gán cho X: X=15; +@B= (@D = (4,8,6)); dãy Bsẽ có cùng giá trị với dãy D là (4,8,6); 2.2.Context (Array & Scalar) : Đôi khi bạn cũng có thể điều khiển kiểu dữ liệu của một array hoặc một Scalar mà nó được trả về từ một function. Nếu bạn đặt dấu ngoặc đơn quanh một hàm được gọi, giá trị trả về sẽ được đặt trong một dãy. Function mà gọi một hàm khác thì cũng thường được định là một array context. Bạn có thể sử dụng hàm scalar( ) để tạo -4- một scalar context. Nó rất có ích khi xác định kích cỡ của một dãy. Ví dụ scalar(@array) sẽ trả về số phần tử trong @array. Ví dụ : @Z = (“d”,”a”,”v”,”I”,”s”); print (@Z.” is a magic number\n”); sẽ xuất ra như sau : 5 is a magic number 2.3.Toán tử Subscripting : Trong một danh sách dãy mỗi phần tử được đánh dấu như một integer maker hoặc index value, bắt đầu từ bên trái với 0 và tăng lên đến cuối danh sách. Để thực hiện điều này chúng ta sử dụng lệnh truy xuất phần tử, hay có thể sử dụng toán tử subscript, để truyền những trị tới những biến khác. Nó rất tiện lợi khi sử dụng những phần tử từ một dãy cho những mục đích khác bằng cách truyền chúng vào trong một biến scalar, hoặc sửa đổi một phần tử trong một dãy. Những khả năng này rất hữu ích để cập nhật nhiều loại danh sách dữ liệu. Ví dụ : @numbers = (3,5,7); $pick_one = $numbers[0]; # truyền 3 vào biến $pick_one $number[0] = 4; # biến @numbers nhận những phần tử là (4,5,7) $pick_another = $numbers[2];# truyền 7 vào biến $pick_another $numbers[1]++ # tự động tăng phần tử thứ hai trong biến #@numbers lên $numbers[0] += 8; #thêm 8 vào phần tử đầu, giá trị được liệt kê #bây giờ là (12,6,7) ($numbers[1],$numbers[0] = ($numbers[0],$nmbers[1]; # phần tử thứ nhất và thứ hai trong biến $numbers được #chuyển đổi, giá trị được liệt kê bây giờ là (6,12,7) 2.4.Toán tử push & pop. Một sự phổ biến của dãy và cũng là lợi điểm của dãy là khả năng chứa của nó. Hai toán tử push và pop trong ngôn ngữ Perl được sử dụng để giúp cho người dùng được dễ dàng hơn trong việc thêm vào và lấy ra những phần tử trong dãy. ví dụ: push (@newuser , $tên ) ; thêm giá trị của biến tên vào cuối dãy newuser pop (@newuser) = $tên ; gán phần tử cuối của dãy newuser cho biến tên. 2.5.Toán tử shift & unshift. -5- Hai toán tử nay cũng giống làmgiống như hai toán tử push và pop, chúng cũng được sử dụng để thêm bớt các phần tử trong dãy, nhưng hai toán tử này thực hiện tác vụ từ bên trái trong khi push và pop thực hiện tác vụ từ bên phải. vídụ: + @images = (4,3,6); unshift(@image, 1, 8 , 4); biến dãy image sẽ mang giá trị = (1,8,4,4,6,3). + $minus = shift(@images ); sẽ lấy giá trị đầu tiên của dãy gán cho biến minus. 2.6.Toán tử reverse, sort, chop . -Toán tử reverse: toán tử này cho phép đảo thứ tự của một dãy. @up = (1,2,3); @down = (reverse(@up); biến dãy down sẽ bằng (3,2,1). nếu bạn muốn thay đổi nội dungbên trong một dãy và lấy luôn giá trị vừa thay đổi đó làm giá trị mới của ngay biến đó thì ta thực hiện như sau. @up = reverse (@up); biến up sẽ có giá trị mới chính là giá trị cũ của nó đảo ngược. -Toán tử sort : toán tử nay cho phép ta đem lại sự thứ tự cho danh sách theo cơ sở là thứ tự của bộ mã ASCII. Vì thế chúng ta sẽ gặp rắc rối khi áp dụng toán tử này cho số. vídụ: +@users = sort(“bob” , “jack” , “daisy”, “anne”); ta sẽ có giá trị của dãy users là : anne, bob, daisy, jack. áp dụng cho số: +@count = (1 , 2 , 8 , 34 , 67 , 15); @count = sort(@count); count sẽ có giá trị là :1, 15 , 34 , 67, 8 -Toán tử chop : công dụng của toán tử này chúng ta đã từng đề cập đến trong phần biến vô hướng trước và ở đây, chúng ta sẽ áp dụng toán tử này cho biến dãy.Toán tử này giúp ta bỏ đi những ký tự cuối cùng trong dãy. vídụ: @A = (“anne\n” , “bob\n” , “feed\n”); chop @A; sẽ cho ta giá trị của dãy A là một dãy : anne, bob, feed. 3.Dãy và <STDIN>. -6- Cũng giống như toán tử chop, <STDIN> cũng được sử dụng cho dãy. Khi áp dụng trong dãy thì <STDIN> sẽ trả về tất cả những dòng còn lại của một file. Mọi hàng trong một file đều được đọc như một phần tử riêng biệt. vídụ: print “sở thích?” @A = <STDIN>; người sử dụng có thể nhập thông tin vào tại đây, nếu muốn kết thúc dòng thông tin nhập thì nhấn tổ hợp phím Control_D. giả sử ta nhập vào những thông tin sau: bơi chạy hát thì ta sẽ nhận được giá trị của dãy A là : @A = (“bơi\n” , “chạy\n” , “hát\n”); sau đó ta sẽ dùng hàm chop làm gọn dãy để sử dụng cho các phép tính sau : chop (@A); @A = (“bơi” , “chạy” , “hát”); 4. Chuỗi ngoặc kép cũng được sử dụng với dãy giống như với biến vô hướng. Ta có thể sử dụng chuỗi ngoặc kép bên trong dãy như sau : @weather = (“sunny” , “rainy”); $forcast = “tomorrow will be $wether[0]”; khi xuất giá trị của biến forcast, ta sẽ được chuỗi sau “tomorrow willbe sunny”. Bạn cũng có thể thêm vào một danh sách giá trị những giá trị từ một biến dãy: @pig = (“corn” , “hay” , “slop”); $eat = “pigs like to est @pig when thay are hungry”; khi xuất biến $eat, ta sẽ được một câu sau: “pigs like to eat corn hay slop when thay are hungry”. ta cũng có thể xuất những phần tử trong dãy bằng cách chỉ định trước: ví dụ: @pig = (“corn” , “hay” , “slop”); $eat = “pigs like to eat @pigs[1,2] when they are hungry”; khi xuất biến $eat, ta sẽ được : “pigs like to eat hay slop when they are hungry”; -7- . ( 15, 4,3,8,7); $A=@A; sau phép gán trên thì giá trị của biến vô hướng A sẽ là 5 (chiều dài của dãy A); + ($X) = @A; phép gán trên sẽ lấy giá trị của phần tử đầu tiên của dãy A gán cho X: X= 15; . thường gọi là dãy. Một dãy được tạo thành từ những phần tử riêng biệt, những phần tử này lại là những biến riêng lẻ vàgiá trị của chúng. Những phần tử của một dãy được -2- đánh số thứ tự từ thấp. sách dữ liệu. Ví dụ : @numbers = (3 ,5, 7); $pick_one = $numbers[0]; # truyền 3 vào biến $pick_one $number[0] = 4; # biến @numbers nhận những phần tử là (4 ,5, 7) $pick_another = $numbers[2];# truyền