Learning Perl - Dữ liệu vô hướng part 2 potx

5 315 0
Learning Perl - Dữ liệu vô hướng part 2 potx

Đang tải... (xem toàn văn)

Thông tin tài liệu

Trong trường hợp thứ nhất, toán tử ** có luật kết hợp phải, cho nên các dấu ngoặc được áp dụng từ bên phải. So sánh với nó, các toán tử * và / có luật kết hợp trái, cho tập các dấu ngoặc bên trái. 2.4.4 Chuyển đổi giữa số và xâu Nếu một giá trị xâu được dùng như một toán hạng cho một toán tử số (chẳng hạn, +), thì Perl sẽ tự động chuyển xâu thành giá trị số tương đương, dường như nó đã được đưa vào như một giá trị dấu phẩy động. Những chất liệu phi số đằng đuôi và khoảng trắng đằng đầu đều bị bỏ qua một cách yên lặng và lễ phép, cho nên " 123.45fred" (với dấu cách đứng trước) chuyển thành 123.45 với lời 'nhắc nhở nhẹ nhàng'. Tại một cực điểm của điều này, một cái gì đó không phải là số tẹo nào sẽ được chuyển thành 0 mà không có báo trước (như xâu "jerry" được dùng như số). Giống vậy, nếu một giá trị số được cho khi đang cần tới một giá trị xâu (cho phép ghép xâu chẳng hạn), thì giá trị số sẽ được mở rộng thành bất kì xâu nào sẽ được in ra cho số đó. Chẳng hạn, nếu bạn muốn ghép nối x và theo sau là kết quả của 4 nhân với 5 thì bạn có thể làm đơn giản là: "X".(4*5) sẽ thành "X".20, hay "X20". (nhớ rằng các dấu ngoặc này buộc 4*5 phải được tính trước khi xem xét toán tử ghép nối xâu). Nói cách khác, bạn không thực sự phải lo lắng gì về liệu bạn có một số hay một xâu (phần lớn thời gian). Perl thực hiện mọi chuyển đổi cho bạn. 2.5 Biến vô hướng Một biến là một tên gọi cho một chỗ chứa giữ được một hay nhiều giá trị. Tên của biến là không đổi trong toàn bộ chương trình, nhưng giá trị hay các giá trị được chứa trong biến đó về cơ bản thì lại thay đổi đi thay đổi lại trong suốt sự thực hiện chương trình. Một biến vô hướng thì giữ một giá trị vô hướng riêng (biểu thị cho một số, hay một xâu, hay cả hai). Các tên biến vô hướng bắt đầu với dấu $ và tiếp theo sau là một chữ, rồi thì có thể là nhiều chữ, số hay dấu gạch dưới. Chữ hoa và chữ thường là phân biệt: biến $A là khác biến $a. Và tất cả các chữ, số và gạch thấp đều có nghĩa, cho nên: $a_very_long_variable_that_ends_in_1 là khác với $a_very_long_variable_that_ends_in_2. Bạn nói chung nên chọn tên biến mang một nghĩa nào đó có liên quan tới giá trị của biến đó. Chẳng hạn, $xyz123 có lẽ không mang tính mô tả nhiều lắm nhưng $line_length thì lại có nghĩa. 2.6 Các toán tử trên biến vô hướng Phép toán thông dụng nhất trên biến vô hướng là phép gán, chính là cách đặt một giá trị cho một biến. Toán tử gán của Perl là dấu bằng (giống như C hay FORTRAN), để tên biến bên vế trái và cho giá trị của biểu thức bên vế phải, kiểu như: $a = 17; # cho $a giá trị 17 $b = $a + 3; # cho $b giá trị hiện tại của $a cộng với 3 (20) $b = $b * 2; # cho $b giá trị của $b được nhân với 2 (40) Chú ý rằng dòng cuối dùng biến $b hai lần: khi lấy được giá trị của nó (ở vế phải dấu =), và khi xác định xem phải đặt biểu thức tính được vào đâu (ở vế trái của dấu =). Điều này là hợp lệ, an toàn và trong thực tế, khá thông dụng. Trong thực tế, nó thông dụng đến mức chúng ta sẽ thấy trong vài phút đây là ta có thể viết điều này bằng việc dùng cách viết tắt qui ước. Bạn có thể đã chú ý rằng các biến vô hướng bao giờ cũng được tham khảo bằng dấu $ đứng trước. Trong các kịch bản shell, bạn dùng $ để lấy một giá trị, nhưng để $ đứng một mình để gán một giá trị mới. Trong awk hay C, bạn để cho $ đứng riêng hoàn toàn. Việc gán vô hướng có thể được dùng như một giá trị cũng như một phép toán, như trong C. Nói cách khác, $a = 3 có một giá trị, cũng như $a+3 có một giá trị. Giá trị chính là số được gán, cho nên giá trị của $a = 3 là 3. Mặc dầu điều này dường như có vẻ kì lạ lúc thoáng nhìn, việc dùng một phép gán như một giá trị lại có ích nếu bạn muốn gán một giá trị trung gian trong một biểu thức cho một biến, hay nếu bạn muốn đơn giản sao cùng một giá trị cho một hay nhiều biến. Chẳng hạn: $b = 4 + ($a = 3); # gán 3 cho $a, rồi cộng kết quả đó với 4 đặt vào $b, được 7 $d = ($c = 5); # sao 5 vào $c, và rồi sao vào $d $d = ($c = 5); # sao 5 vào $c, và rồi sao vào $d $d = $c = 5; # tương tự như trên, nhưng không có dấu ngoặc 2.6.1 Toán tử gán hai ngôi Gần như tất cả các toán tử hai ngôi tính một giá trị đều có dạng phép gán hai ngôi tương ứng với dấu bằng có bổ sung thêm phần tử. Chẳng hạn, hai dòng sau đây là tương đương: $a = $a + 5; # không có toán tử gán hai ngôi $a += 5; # có toán tử gán hai ngôi Và tương tự như thế: $b = $b * 3; $b *= 3; Trong từng trường hợp, toán tử này làm cho giá trị hiện tại của biến được thay đổi theo một cách nào đó, thay vì đơn giản ghi đè lên giá trị này bằng kết quả của một biểu thức mới nào đó. Toán tử gán thông dụng khác là toán tử ghép nối xâu: $str = $str . " "; # thêm dấu cách vào $str $str .= " "; # cũng điều ấy với toán tử gán Gần như tất cả các toán tử hai ngôi đều hợp lệ theo cách này. Chẳng hạn, toán tử nâng lên luỹ thừa của sẽ được viết là **=. Cho nên, $a **= 3 có nghĩa là "nâng một số trong $a lên luỹ thừa ba, rồi đặt kết quả trở lại $a". Giống như toán tử gán đơn, các toán tử này cũng có một giá trị: giá trị mới của biến. Chẳng hạn: $a = 3; $b = ($a += 4); # $a và $b cả hai bây giờ đều là 7 Nhưng không may là trật tự tính toán của các toán hạng của toán tử hai ngôi lại không được xác định, cho nên một số biểu thức không thể nào được xác định hoàn toàn: $a = 3; $b = ($a += 2) * ($a -= 2); # Chương trình tồi: $b có thể là 15 hay 3 Nếu toán hạng bên phải của phép nhân được tính đầu tiên thì kết quả sẽ là 3 lần 1, hay 3. Tuy nhiên, nếu toán hạng bên trái được tính trước toán hạng bên phải, thì nó là 5 lần 3, hay 15. 2.6.2 Tự tăng và tự giảm Dường như cũng đã đủ dễ dàng để thêm 1 vào $a bằng việc nói $a += 1. Perl còn đi xa hơn và thậm chí lại còn làm ngắn hơn cho điều này nữa. Toán tử ++ (được gọi là toán tử tự tăng) cộng thêm một vào toán hạng của nó, và cho lại giá trị đã được tăng, giống như: $a += 1; # dùng toán tử gán ++$a; # dùng tự tăng tiền tố $d = 17; $e = ++$d; # $e và $d bây giờ đều là 18 Tại đây, toán tử ++ được dùng như toán tử tiền tố; tức là, toán tử xuất hiện ở bên trái toán hạng của nó. Phép tự tăng cũng có thể được dùng trong dạng hậu tố (nằm ở bên phải toán hạng của nó). Trong trường hợp này, kết quả của biểu thức này là giá trị của biến trước khi biến được tăng lên. Chẳng hạn: $c = 17; $d = $c++; # $d là 17, nhưng $c bây giờ là 18 Vì giá trị của toán hạng thay đổi nên toán hạng này phải là một biến vô hướng, không phải là biểu thức. Bạn không thể nói ++16 để có được 17, mà cũng không thể nói ++($a+$b) (là cách nào đó để có được giá trị lớn hơn tổng của $a và $b một đơn vị). Toán tử tự giảm ( ) cũng tương tự như toán tử tự tăng, nhưng trừ đi một thay vì cộng với một. Giống như toán tử tự tăng, toán tử tự giảm cũng có dạng tiền tố và hậu tố. Chẳng hạn: $x = 12; $x; # $x bây giờ là 11 $y = $x ; # $y là 11, còn $x bây giờ là 10 Không giống C, các toán tử tự tăng và tự giảm làm việc trên số dấu phẩy động. Cho nên việc tăng một biến với giá trị 4.2 sẽ cho 5.2 như dự kiến. 2.6.3 Toán tử chop() và chomp() Một toán tử khác là chop(). Toán tử tiền tố này nhận một đối bên trong các dấu ngoặc của nó - tên của một biến vô hướng - và bỏ đi kí tự cuối cùng từ giá trị xâu của biến đó. Chẳng hạn: $x = "Xin chào mọi người"; chop($x); # $x bây giờ là "Xin chào mọi ngườ" Lưu ý rằng giá trị của đối bị thay đổi ở đây, do đó cần phải có một biến vô hướng, thay vì chỉ đơn giản là giá trị vô hướng. Sẽ là vô nghĩa, chẳng hạn, để viết chop('suey') để biến nó thành 'sue'’, vì không có chỗ nào để cất giữ giá trị này. Bên cạnh đó, bạn có thể chỉ viết 'sue' cũng đủ. Toán tử này trông giống như một lời gọi hàm, và quả thực trả về một giá trị (mà bạn sẽ trông đợi nếu bạn quen thuộc với lời gọi hàm từ các ngôn ngữ). Giá trị được cho lại chính là kí tự đã bị loại bỏ (chữ i trong người ở trên). Điều này có nghĩa là đoạn mã sau đây có lẽ sai: $x = chop($x); # SAI: thay thế $x bằng ksi tự cuối cùng của nó chop($x); # Đúng: như trên, loại bỏ kí tự cuối Nếu chop() được cho một xâu rỗng, thì nó chẳng làm gì cả. chomp() tương tự như chop() nhưng nó chỉ xoá nếu ký tự cuối dùng của biến là ký tự dòng mới mà thôi, nếu là ký tự khác thì nó không làm gì cả. Bạn nên dùng chomp() thay cho chop() khi có thể vì nó an toàn hơn. 2.6.4 Xen lẫn vô hướng vào trong xâu Khi một hằng kí tự xâu là được đặt trong nháy kép thì nó là chủ đề cho việc xen lẫn biến (bên cạnh việc được kiểm tra cho lối thoát sổ chéo ngược). Điều này có nghĩa là xâu này được duyệt qua để tìm các tên biến vô hướng có thể - có nghĩa là dấu $ đi theo sau một chữ, số hay dấu gạch dưới. Khi tìm thấy một tham khảo biến thì nó được thay thế bằng giá trị hiện tại (hay bất kì xâu rỗng nào nếu biến vô hướng còn chưa được gán giá trị nào). Chẳng hạn: $a = "jerry"; $b = "some text $a"; # $b bây giờ là "some text jerry" $c = "no such variable $what"; # $c là "no such variable " Để ngăn việc thay thế một biến bằng giá trị của nó, bạn phải hoặc làm thay đổi phần đó của xâu để cho nó xuất hiện trong ngoặc đơn, hoặc đặt trước dấu $ một dấu sổ chéo ngược: $jerry = 'hi'; $tom = "a test of ".'$jerry'; # hằng kí hiệu: ‘a test of $jerry’ $tom2 = "a test of \$jerry"; # cũng như vậy Tên biến sẽ là tên biến dài nhất có thể mà tạo nên nghĩa tại phần đó của xâu. Điều này có thể là vấn đề nếu bạn muốn đặt sau ngay giá trị được thay thế với một văn bản hằng mà bắt đầu bằng một chữ, số hay dấu gạch thấp. Vì Perl duyệt qua các tên biến nên nó sẽ xét những kí tự là các kí tự tên phụ, mà không phải là điều bạn muốn. Perl cung cấp một định biên cho tên biến theo các hệ thống tương tự như lớp vỏ. Bạn hãy đơn thuần bao tên của biến đó trong một cặp dấu { và }. Hay bạn có thể kết thúc phần đó của xâu và bắt đầu một phần khác của xâu bằng toán tử ghép nối: $fred = 'pay'; $fredday = "wrong!"; $tom = "It’s $fredday"; # không phải payday, mà là "It’s wrong!" $tom = "It’s ${fred}day"; # bây giờ, $tom là "It’s payday!" $barney2 = "It’s $fred".'day'; # cách khác để làm việc đó $barney3 = "It’s " . $fred . "day"; # và một cách khác nữa Toán tử sổ chéo ngược chuyển hoa thường có thể được dùng để làm thay đổi chữ hoa thường được đem theo cùng việc xen lẫn biến. Chẳng hạn: $bigfred = "\Ufred"; # $bigfred là FRED $jerry = "fred"; $bigfred = "\U$jerry"; # tương tự như trên $capfred = "\u$jerry"; # $capfred là "Fred" $tom = "\LBARNEY"; # $tom bây giờ là "barney" $capbarney = "\u\LBARNEY"; # capbarney bây giờ là "Barney" $bigbarney = "BARNEY"; $capbarney = "\u\L$bigbarney"; # như trên Như bạn có thể thấy, các toán tử dịch chuyển hoa thường được ghi nhớ bên trong xâu chừng nào chúng còn chưa được dùng tới, cho nên ngay kí tự đầu tiên của $capbarney không tuân theo \u, nó vẫn còn là chữ hoa vì \u chưa được dùng đến cho đến khi \L được dùng xong. Thuật ngữ xen lẫn biến thường được dùng lẫn với xen lẫn nháy kép, vì các xâu có nháy kép là chủ đề cho việc xen lẫn biến. 2.7 <STDIN> xem như một vô hướng Tại điểm này, bạn có thể tự hỏi làm sao lấy được một giá trị vào trong chương trình Perl. Sau đây là cách đơn giản nhất. Mỗi lần bạn dùng <STDIN> ở chỗ đang trông đợi một giá trị vô hướng, thì Perl sẽ đọc toàn bộ dòng văn bản tiếp từ lối vào chuẩn (cho tới dấu dòng mới đầu tiên), và dùng xâu đó như giá trị cho <STDIN>. Đầu vào chuẩn có thể mang nhiều nghĩa, nhưng chừng nào bạn còn chưa làm điều gì đó thì nó vẫn còn mang nghĩa là thiết bị cuối của người dùng, người đã gọi chương trình của bạn (có thể là bạn). Nếu không có gì chờ đợi để đọc cả (trường hợp điển hình, chừng nào bạn còn chưa gõ xong toàn bộ dòng), thì chương trình Perl sẽ dừng và đợi cho bạn đưa vào một số kí tự theo sau bằng một dấu dòng mới (xuống dòng). Giá trị xâu của <STDIN> về điển hình có một dấu dòng mới ở cuối của nó. Thông thường nhất là bạn muốn gỡ bỏ cái dấu dòng mới đó đi (có sự khác biệt lớn giữa hello và hello\n) (dùng toán tử chop() để hỗ trợ). Một dãy data input đại loại như thế này: $a = <STDIN>; # nhận văn bản chomp($a); # gỡ bỏ dấu dòng mới Cách viết tắt thông dụng cho hai dòng này là: chomp($a = <STDIN>); Phép gán bên trong các dấu ngoặc tròn tiếp tục là một tham khảo tới $a, thậm chí sau khi nó đã được trao cho một giá trị với toán tử <STDIN>. Vậy, toán tử chomp() làm việc trên $a. (Điều này là đúng nói chung đối với toán tử gán - một biểu thức gán có thể được dùng bất kì khi nào một biến là cần tới, và những hành động tham khảo tới biến đó ở bên trái của dấu bằng). 2.8 Đưa ra bằng print() Vậy ta thu được mọi thứ với <STDIN>. Ta làm sao đưa ra mọi thứ đây? Bằng toán tử print(). Toán tử tiền tố này nhận một giá trị vô hướng bên trong các dấu ngoặc của nó và đưa ra mà không cần bất kì sự trang điểm nào lên lối ra chuẩn. Một lần nữa, chừng nào bạn còn chưa làm điều gì thì lối ra này vẫn cứ là thiết bị cuối của bạn. Chẳng hạn: print("Xin chào mọi người\n"); # nói chào mọi người, tiếp là dấu dòng mới print "Xin chào mọi người\n"; # tương tự như trên Lưu ý rằng thí dụ thứ hai chỉ ra dạng của print() không có dấu ngoặc. Trong thực tế, nhiều toán tử trông như các hàm cũng có dạng cú pháp làm việc không cần dấu ngoặc. Dù có dùng hay không, dấu ngoặc cũng gần như là vấn đề về kiểu cách và sự nhanh nhẩu trong cách gõ, mặc dầu có vài trường hợp bạn sẽ cần các dấu ngoặc để loại bỏ bớt sự mập mờ. Chúng ta sẽ thấy rằng bạn thực tế có thể cho print một danh sách các giá trị, trong mục "Dùng print để xuất" ở Chương 6: Nhấp/Xuất căn bản, nhưng chúng ta vẫn còn chưa nói về danh sách, cho nên chúng ta sẽ nói nó về sau. 2.9 Giá trị undef Điều gì sẽ xảy ra nếu bạn dùng một biến vô hướng trước khi bạn cho nó một giá trị? Chẳng có gì nghiêm trọng cả. Các biến đều có giá trị undef trước khi chúng được gán lần đầu tiên. Giá trị này trông như số 0 khi được dùng như một số, hay xâu rỗng chiều dài 0 nếu được dùng như một xâu. Nhiều toán tử trả về undef khi các đối vượt ra ngoài phạm vi và thành vô nghĩa. Một toán tử mà chúng ta đã thấy có trả về undef là toán tử <STDIN>. Thông thường toán tử này cho lại một xâu của dòng tiếp vừa được đọc, tuy nhiên (như khi bạn gõ control-D tại thiết bị cuối, hay khi một tệp không còn dữ liệu nữa), thì toán tử này trả vềi undef như một giá trị. Chúng ta sẽ thấy trong chương 6 cách kiểm tra này và chọn hành động đặc biệt khi không còn dữ liệu nào có sẵn để đọc nữa. 2.10 Bài tập 1. Bạn hãy viết 1 chương trình tính và in ra chu vi của 1 đường tròn cho bán kính là 12.5. 2. Hãy sửa lại chương trình ở trên sao cho chương trình đưa ra 1 câu thông báo và đợi người dùng nhập bán kính vào từ bàn phím. 3. Bạn hãy viết chương trình đọc vào 2 số và in ra tích của 2 số đó. 4. Bạn hãy viết chương trình đọc vào một xâu và một số, sau đó in ra xâu đó với số lần được chỉ định bởi giá trị của số được nhập vào (dùng toán tử x) Mục lục «« Chương 1 »» Chương 3 . trị 4 .2 sẽ cho 5 .2 như dự kiến. 2. 6.3 Toán tử chop() và chomp() Một toán tử khác là chop(). Toán tử tiền tố này nhận một đối bên trong các dấu ngoặc của nó - tên của một biến vô hướng - và bỏ. suốt sự thực hiện chương trình. Một biến vô hướng thì giữ một giá trị vô hướng riêng (biểu thị cho một số, hay một xâu, hay cả hai). Các tên biến vô hướng bắt đầu với dấu $ và tiếp theo sau là. nghĩa. 2. 6 Các toán tử trên biến vô hướng Phép toán thông dụng nhất trên biến vô hướng là phép gán, chính là cách đặt một giá trị cho một biến. Toán tử gán của Perl là dấu bằng (giống như C hay

Ngày đăng: 26/07/2014, 12:20

Tài liệu cùng người dùng

Tài liệu liên quan