BTQT như là những mẫu (pattern)

Một phần của tài liệu Ngôn ngữ lập trình PERL (Trang 31 - 36)

Có những mẫu khác nhau . BTQT làm việc với : ký tự đơn , nhóm , và neo . Mỗi mẫu có một vài đặt tính riêng tạo cho nó làm việc.

Sự tương thích mẫu ký tự thường dùng nhất là ký tự đơn dùng để làm nó tương thích với những ký tự đơn , tức là dùng một chữ cái như một BTQT để làm nó tương thích với những từ khác , BTQT “a” tìm kiếm cho ký tự “a” trong một chuổi .

Ký tự tương thích mẫu thường dùng thứ hai là một dấu chấm câu hay đánh dấu chấm “.” . Dấu chấm này sẽ làm tương thích một số ký tự đơn với sự chấp nhận tác vụ newline , /n .

Hoạt động trong những vùng rộng lớn , một lớp ký tự tương thích mẫu có thể xảy ra khi một tập hợp các dấu ngoặc vuông được dùng bao BTQT trong vấn đề : / [crypt]/ Khi một lớp ký tự được dùng , một tương thích sẽ xảy ra nếu một số ký tự trong BTQT với các chuổi đang được kiểm tra . Nó rất quan trọng để lưu y ù đó là những BTQT thử một cách chính xác có thể thực hiện được không giới hạn tầm vực của nó vì vậy chúng rất nhạy cảm với kiểu chữ (case-sensitive) .

Một sự tham gia khác , chỉ một trong những ký tự nằm trong vị trí tương đối chính xác phải nằm trong BTQT để cho một tương thích xảy ra . Ta có thể chỉ định một phạm vi với tác vụ này bằng cách chèn một gạch ngang giữa hai giá trị .

Ví dụ : / [0-5] /

Tương tự như : / [0 1 2 3 4 5] /

Nó có thể rất có ít nếu ta duy trì điều đó / [a – za – Z0 – 9] /

Có thể tìm tất cả những chữ cái của bảng chữ cái gồm chữ thường và chữ hoa cũng tốt như là tìm những số .

Cách ngược lại nếu ta muốn dùng lớp ký tự của ví dụ , để trả về những tương thích không nằm trong BTQT thì đặt một dấu mũ ( ^ ) sau dấu ngoặc vuông bên trái như sau: / [ ^0 - 5 ]/ .

Biểu thức này tương thích với mọi ký tự đơn không nằm trong phạm vi từ 0 đến 5 . Có một số lớp ký tự thường dùng trong Perl được liệt kê sau :

CONSTRUCT EQUIVALENT CLASS NEGATED CONSTRUCT EQUIVALENT NEGATED CLASS \d (digits) \w (word) \s (space) [0-9] [a-za-Z0-9] [\r\t\n\f]

\D (anything but digits) \W (anything but word) \S (anything but space)

[^0-9] [^a-za-Z0-9]

[^\r\t\n\f] Trước khi chúng ta bước vào nội dung chính tiếp theo về Perl , hãy áp dụng những gì chúng ta đã khám phá . Chúng ta cũng sẽ bắt đầu tạo những ghi nhanh về những khác biệt nhỏ giữa Unixperl và Perl for windows NT hay Winperl .

Một khác biệt lớn là trong hầu hết các Perl script ta sẽ tìm đường dẫn chứa ở dòng đầu tiên .

Hoặc những thứ tương tự , điều đó không cần thiết với Winperl . Dòng này trong UNIX perl để hệ điều hành biết và tìm chương trình dịch của perl . Với windows NT , ta cần liên kết file có đuôi .pl cho script của ta để thực hiện chức năng . Có thể liên kết đuôi .cgi là một ý kiến hay vì hầu hết các file này cũng được viết trong Perl .

• Mẫu nhóm :

Có vài mẫu nhóm : tuần tự , số nhân , trong dấu ngoặc đơn , và xen kẽ . Dùng những mẫu nhóm ta có thể cho script của ta khả năng đặt những điều kiện cho BTQT tương thích .

• Mẫu nhóm tuần tự :

Nó rất quen thuộc với chúng ta . Đó là nơi một BTQT tương thích với một chuổi một cách chính xác như / crypt /

BTQT xem như là những ký tự tuần tự : crypt .

• Mẫu nhóm số nhân :

Chúng ta đã gặp một trường hợp với dấu * . Dấu * chỉ định tương thích của “zero hay nhiều hơn” ký tự trước . Ký hiệu “ + “ được dùng chỉ định những tương thích trả về chứa một hay nhiều ký tự trước . Để cho biết một tương thích của “ không hay một ” ký tự cho trước , ta sẽ dùng dấu chấm hỏi “?.”. Mỗi mẩu nhóm này sẽ chọn để tương thích chuổi lớn hơn những chuổi nó tìm .

Nếu ta muốn qui định những mẫu nhóm bao nhiêu ký tự là tương thích ta có thể dùng một số nhân thông thường nó có định dạng như / a{2,4} / .Trong đó : a là BTQT chúng ta thử để tương thích , và 2 và 4 là phạm vi của những chuổi sẽ thoả mãn tương thích chuổi của chúng ta , có nghỉa là một tương thích sẽ tìm những chuổi

“aa”,”aaa” và “aaaa” nhưng không tìm những chuổi “a” hay “aaaaa” . Một bổ xung khi không có số thứ hai như với : / a{3, } / . Nó báo cho tương thích tìm kiếm ba hay nhiều hơn chữ cái a. Nếu không có dấu phẩy như với : / a{3} / . Nó sẽ báo cho tương thích tìm đúng ba chữ a . Để tìm kiếm ba hay ít hơn chữ cái a dùng một số 0 trong field phạm vi như : / a{0,3) / . Nếu ta muốn tương thích những điều kiện hai ký tự có thể thử : / a.{3}x / . Điều này sẽ làm cho BTQT tìm một số chữ cái a được tách ra bởi ba ký tự non-newline từ chữ cái x .

• Mẫu nhóm nằm trong dấu ngoặc đơn :

Ta có thể dùng một cặp dấu ngoặc đơn đóng và mở để bao một phần của một biểu thức tương thích , chúng ta cần phải ghi nhớ phần biểu thức được giữ trong những dấu ngoặc đơn đó sẽ được giữ trong bộ nhớ (memory) để dùng tương thích biểu thức nhớ dùng một số nguyên và một dấu \ : / moose ( . ) kiss \1 /;

Biểu thức quy tắc này sẽ tương thích với một số nảy sinh của chuổi “moose,” như : một số ký tự two non-newline theo sau , chuổi “kiss,” theo sau , hay một số ký tự one non-newline theo sau . BTQT này sẽ ghi nhớ những ký tự non-newline đơn nó

tương thích với “moose” và xem như vậy với “kiss” ,ví dụ: Mooseq kiss q là tương thích nhưng Mooseq kiss w thì không .

Đây là một BTQT khác /moose.kiss./; . Nó sẽ tương thích một số ký tự two non-newline , cho dù chúng giống hay không . “1” nằm giữa hai dấu / liên hệ đến những gì nằm trong ngoặc đơn . Nếu có nhiều hơn một tập các dấu ngoặc đơn ta có thể dùng số giữa hai dấu / để chỉ cái mà ta muốn ghi nhớ bắt đầu từ trái sang phải ví dụ : / a ( . )p( . )e\1s/ . Ký tự đầu tiên là “a” theo sau là : #1 ký tự non-newline , “p” , # ký tự 2 new-line , “e,” , bất kỳ #1 một ký tự non-newline , “s” . Nó sẽ tương thích với :Aqpdeqs .

Những ký tự non-newline khác phải tương thích với sự chỉ định chúng . Để cộng thêm khả năng tương thích nhiều hơn một ký tự đơn với phần đã được tham khảo , chỉ cộng một dấu sao * vào biểu thức như : / a ( . * )p\ 1e /; .Biểu thức này sẽ tương thích với “a” theo sau là một số ký tự non-newline , theo sau là “p,” , theo sau là một dãy những ký tự non-newline tương tự và sau đó là “e” . Một tương thích có thể là :

Aplanetpplanete .Nhưng không tương thích với: Aqqpqqpe .Ta cũng có thể dùng mẫu nhóm nhớ thay thế những phần chia ra của một chuổi như :

$_= “a peas p corn e squash”; S / p ( . * ) e / b \1 c / ;

Tạo giá trị chuổi mới như : A peas b corn c squash

“p” và “e” được thay thế bằng “p” và “c”nhưng ở giữa vẫn không thay đổi .

• Mẫu nhóm xen kẻ :

Định dạng thông thường là A p e

BTQT được yêu cầu để tương thích với một xen kẽ được chỉ định , “a” ,”p” ,

hay “e” . Ta có thể áp dụng sự xen kẽ cho nhiều ký tự do đó Apegorilla monkey Sẽ có hiệu lực tương đương .

• Mẫu neo:

Để neo một mẫu có bốn ký hiệu đặc biệt có thể làm được.Ta muốn neo sự tìm kiếm BTQT của chúng ta nếu ta không muốn xuất hiện tất cả các trường hợp của một chuổi . Cho ví dụ khi tìm chuổi “the” ta không muốn nhận “then “ “there” “them”... Để làm điều đó ta có thể dùng từ neo boundry \b : /the \b / . Do đó chỉ những chuổi kết thúc bằng “the” mới được tương thích . Nhưng nó không cắt một chuổi như “absinthe” , do đó ta có thể cộng thêm một từ neo boundary vào trước BTQT đó . / \b the \b / . Vì vậy chỉ đúng một tương thích được trả về .

Nếu trên sự kiểm soát khác , ta muốn tương thích với chỉ những truờng hợp chứa chuổi đó trong BTQT , và không phải bản thân chuổi đó ta có thể dùng neo \B / the \b / . Trả về tương thích “thee” “these” “absinthe” “there” và “then” nhưng không trả về “the” . Neo kế là \^ được dùng làm tương thích với điểm bắt đầu của một chuổi chỉ khi nó nằm ở chổ nhận biết để tương thích như với : / \^the / . Nó chỉ tương thích với những chuỗi bắt đầu bằng “the” . Neo cuối \$ , làm việc tương tự

nhưng đặt ở cuối chuổi

/ the \$ / Sẽ tương thích với những nảy sinh của “the” xuất hiện ở cuối chuổi

•Quyền ưu tiên của mẫu :

Như với tác vụ , cả hai mẫu nhóm và neo có thứ tự ưu tiên như trong bảng liệt kê dưới theo thứ tự trên xuống .

Ta có thể dùng những dấu ngoặc đơn để làm sáng sủa một BTQT vì nó có thứ tự ưu tiên cao nhất , những thí dụ sau sẽ trình bày sự khác biệt trong những tương thích gây ra khi dùng những dấu ngoặc đơn .

Bảng liệt kê :Pattern Precedence from Highest to Lowest

NAME REPRESENTATION

Parentheses Mulipliers

Sequence and Anchoring Alternation

( )+ * ? {a,b} + * ? {a,b} Ape\b\B\^\$

|

Ape* sẽ tương thích với ap , ape , apee , apeee , ... Nhưng ngược lại (ape) Sẽ tương thích với “ “ , ape , apeape , apeapeape , ...

Và \^a b sẽ tương thích với “a” ở vị trí bắt đầu của dòng hay “b” ở vị trí bất kỳ

trong dòng .

Thêm nữa \^(a b) sẽ tương thích với “a” hay “b” ở vị trí bắt đầu của dòng ,và

Ape s tương thích với “a” “pe” hay “s” nếu ta thêm những dấu ngoặc đơn (a pe )

(pe s ) sẽ tương thích với ape , as , pepe , và pes những dấu ngoặc đơn có thể được dùng để tìm những từ có liên quan như sau :

(soft hard)wood .

Một trong hai trường hợp softwood hay hardwook sẽ được trả về như những tương

thích .

Một điều có thể dùng cho những tác vụ tương thích có lẽ là một script tìm kiếm một câu trả lời chung chi phối đến một câu trả lời . Ta có thể dùng tác vụ “=~” để làm điều đó,với tác vụ này đặt đối tượng của BTQT như là một giá trị mới. Ta đã điền đầy $_ với một giá trị sẽ cần sau này trong script . Sau đó ta có thể dùng =~ làm thay đổi sự điều khiển tạm thời tác vụ =~ hoạt động .

• Những mẫu tin nhỏ của tác vụ tương thích khác :

Có một số cách khác để sửa BTQT . Perl dùng ký hiệu “ I ” báo cho BTQT phớt lờ kiểu chữ (case) trong việc tương thích . Trong định dạng sau :

/ string_characters / i

Ta sẽ sửa một dòng trong script thí dụ sau cùng từ đây : If (<STDIN> =~ /^[Yy]/ )

Đến

If (<STDIN> =~/^y / i )

Vì vậy trong trường hợp này câu trả lời là không có một câu trả lời xác định nào . Nếu ta muốn dùng một script để tìm ra đường dẫn của file ta sẽ cần đưa vào trong biểu thức những dấu suyệt . Và theo trật tự làm : một dấu / phải được đặc trước nó một dấu \ để xuất hiện chỉ như một ký tự trong chuổi /^\/usr\/bin\/perl / .

Một phần của tài liệu Ngôn ngữ lập trình PERL (Trang 31 - 36)