1. Trang chủ
  2. » Công Nghệ Thông Tin

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

5 315 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 257,5 KB

Nội dung

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

Trang 1

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á 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 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 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 toà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 trì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á 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, 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ư:

$a = 17; # c ho $a giá trị 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 T rong 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, 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 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

$d = ($c = 5); # sao 5 vào $c, và rồi sao vào $d

Trang 2

$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 ác h 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 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ư:

$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á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; # $x bây giờ là 11

Trang 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";

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ì c hỉ đơn giản

là giá trị vô hướng Sẽ là vô nghĩa, c hẳ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 c ho lại c hí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ự c uối c ùng c ủa nó

chop($x); # Đúng: như trên, loại bỏ kí tự c uối

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ư chop() 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() thay c ho 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à 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 = "some text $a"; # $b bây giờ là "some text jerry"

$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!";

$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ác h khác để làm việc đó

$barney3 = "It’s " $fred "day"; # và một các h khác nữa

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

Trang 4

đ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"; # $c apfred 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 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 <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 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 <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 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 <STDIN> Đầ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 <STDIN> về điển hình c ó một dấu dòng mới ở c uố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ử c hop() để

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ác h viết tắt thông dụng c ho 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 c hí sau khi nó đã được trao cho một giá trị với toán tử <STDIN> 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 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 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ị, 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á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ì

Trang 5

nghiêm trọng c ả Các biến đều c ó giá trị undef trướ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à 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ị 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)

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

TỪ KHÓA LIÊN QUAN

w