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

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

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

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

Trong trường hợp thứ nhất, toán tử ** có luật kết hợp phải, c ho 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 c huyển xâu thành giá trị số tương đương, dường như nó đã được đưa vào như một giá...

Chủ đề:
Lưu

Nội dung Text: Learning Perl - Dữ liệu vô hướng part 2

  1. T rong trường hợp thứ nhất, toán tử * * c ó luật kết hợp phải, c ho 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 t oá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 c huyể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 c hất liệu phi số đằng đuôi và khoảng trắng đằng đầu đều bị bỏ qua một các h yên lặng và lễ phép, c ho nên " 123.45fred" (với dấu c ách đứng trước ) c huyể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 c ho khi đang c ần tới một giá trị xâu (c ho phép ghép xâu c hẳ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 t hì bạn c ó t hể 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 c huyển đổi c ho bạn. 2.5 Biến vô hướng Một biến là một tên gọi c ho một c hỗ c hứa giữ được một hay nhiều giá trị. Tên của biến là không đổi trong t oàn bộ c hươ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 c hương t rình. Một biến vô hướng thì giữ một giá trị vô hướng riêng (biểu thị c ho 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 c hữ, rồi thì có thể là nhiều chữ, s ố hay dấu gạch dưới. Chữ hoa và c hữ thường là phân biệt: biến $A là khác biến $a. Và tất cả c ác c hữ, số và gạc h 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á t rị 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 t hì lại có nghĩa. 2.6 Các toán tử trên biến vô hướng Phép toán t hông dụng nhất trên biến vô hướng là phép gán, c hính là c ác h đặt một giá trị c ho 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à c ho giá trị của biểu thức bên vế phải, kiểu như: # c ho $a giá trị 17 $a = 17; $b = $a + 3; # c ho $b giá trị hiện tại của $a cộng với 3 (20) $b = $b * 2; # c ho $b giá trị c ủa $b được nhân với 2 (40) Chú ý rằng dòng c uố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 c hú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ác h 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ịc h 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 để c ho $ đứ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, c ho 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, v iệ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ị t rung gian trong một biểu thức c ho 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 c ho $a, rồi c ộng kết quả đó với 4 đặt vào $b, được 7 # s ao 5 vào $c, và rồi sao vào $d $d = ($c = 5);
  2. # s ao 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 $d = $c = 5; 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 # c ó toán tử gán hai ngôi $a += 5; 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 t hay đổ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 . " "; # t hêm dấu c ác h vào $str # c ũng điều ấy với toán tử gán $str .= " "; 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 t oá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 c ho đ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à c ho lại giá trị đã được tăng, giống như: # dùng t oán tử gán $a += 1; # dùng tự t ăng tiền tố ++$a; $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ác h 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 bây giờ là 11 --$x;
  3. $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à c hop(). 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ự c uối c ùng từ giá trị xâu c ủa biến đó. Chẳng hạn: $x = "Xin chào mọi người"; # $x bây giờ là "Xin chào mọi ngườ" chop($x); 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ì c hỉ đơn giản là giá trị vô hướng. Sẽ là vô nghĩa, c hẳng hạn, để viết c hop('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á t rị được c ho lại c hính là kí tự đã bị loại bỏ (chữ i trong người ở t rê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ự c uối c ùng c ủa nó # Đúng: như trên, loại bỏ kí tự c uối chop($x); Nếu c hop() được c ho một xâu rỗng, thì nó c hẳng làm gì cả. chomp() t ương tự như c hop() nhưng nó chỉ xoá nếu ký tự c uố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 c homp() t hay c ho c hop() 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à c hủ đề c ho việc xen lẫn biến (bên cạnh việc được kiểm tra c ho 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 c hữ, số hay dấu gạc h 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 c hưa được gán giá trị nào). Chẳng hạn: $a = "jerry"; # $b bây giờ là "some text jerry" $b = "some text $a"; $c = "no such variable $what"; # $c là "no suc h 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ổ c hé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ạc h 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 c ung cấp một định biên c ho 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!"; # không phải payday, mà là "It’s wrong!" $tom = "It’s $fredday"; # bây giờ, $tom là "It’s payday!" $tom = "It’s ${fred}day"; # c ác h khác để làm việc đó $barney2 = "It’s $fred".'day'; # và một các h khác nữa $barney3 = "It’s " . $fred . "day"; Toán tử sổ c héo ngược c huyển hoa thường c ó thể được dùng để làm thay đổi chữ hoa thường được
  4. đem theo c ùng việc xen lẫn biến. Chẳng hạn: $bigfred là FRED # $bigfred = "\Ufred"; t ương tự như trên # $jerry = "fred"; $bigfred = "\U$jerry"; $c apfred là "Fred" # $capfred = "\u$jerry"; $tom bây giờ là "barney" # $tom = "\LBARNEY"; c apbarney bây giờ là "Barney" # $capbarney = "\u\LBARNEY"; như trên # $bigbarney = "BARNEY"; $capbarney = "\u\L$bigbarney"; Như bạn c ó thể thấy, các toán tử dịch chuyển hoa thường được ghi nhớ bên t rong xâu c hừng nào chúng c òn chưa được dùng tới, c ho nên ngay kí tự đầu tiên c ủa $c apbarney không tuân theo \u, nó vẫn c òn là chữ hoa vì \u c hưa được dùng đến c ho đế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à c hủ đề cho việc xen lẫn biến. 2.7 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 c hương trình Perl. Sau đây là các h đơn giản nhất. Mỗi lần bạn dùng ở chỗ đang t rô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 c huẩn (cho tới dấu dòng mới đầu tiên), và dùng xâu đó như giá trị c ho . Đầu vào c huẩn c ó thể mang nhiều nghĩa, nhưng c hừng nào bạn c òn c hưa làm điều gì đó thì nó vẫn c òn mang nghĩa là thiết bị c uố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ì c hờ đợi để đọc cả (trường hợp điển hình, c hừng nào bạn c òn c hưa gõ xong toàn bộ dòng), thì c hươ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 về điển hình c ó một dấu dòng mới ở c uối của nó. T hô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ử c hop() để hỗ trợ). Một dãy data input đại loại như thế này: $a = ; # nhận văn bản # gỡ bỏ dấu dòng mới chomp($a); Các h viết tắt thông dụng c ho hai dòng này là: chomp($a = ); 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 c hí sau khi nó đã được trao cho một giá trị với t oán tử . Vậy, toán tử c homp() 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 t hứ với . 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 t rong 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 c huẩn. Một lần nữa, c hừng nào bạn c òn c hưa làm điều gì thì lối ra này vẫn cứ là thiết bị c uố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 c hỉ 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 ác h và sự nhanh nhẩu trong các h 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ể c ho print một danh sác h c ác giá trị, t rong 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ác h, c ho 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 c ho nó một giá trị? Chẳng có gì
  5. nghiêm t rọng c ả. Các biến đều c ó giá trị undef t rước khi c hú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 c hiề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à c húng ta đã thấy c ó trả về undef là t oán tử . 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ị c uố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à c họ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 c hương trình tính và in ra c hu vi c ủa 1 đường tròn c ho bán kính là 12.5. 2. Hãy sửa lại c hương trình ở trên sao c ho 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 c hương trình đọc vào 2 số và in ra tíc h c ủa 2 số đó. 4. Bạn hãy viết c hươ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 «« C hương 1 »» C hương 3
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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