2010-06-30 24 views
5

sử dụng của tôi bình thường 'x' là:Funky 'x' trong perl

print("#" x 78, "\n"); 

nào concatenates 78 lần so với chuỗi "#". Nhưng gần đây tôi đã xem đoạn mã này:

while (<>) { print if m{^a}x } 

In mọi dòng đầu vào bắt đầu bằng 'a'. Tôi hiểu phần kết hợp regexp (m {^ a}), nhưng tôi thực sự không thấy cái gì 'x' đang làm ở đây.

Mọi giải thích sẽ được đánh giá cao.

Trả lời

18

Đây là công cụ sửa đổi cho regex. Trình sửa đổi x yêu cầu perl bỏ qua khoảng trống và nhận xét bên trong regex.

Trong mã ví dụ của bạn, nó không tạo sự khác biệt vì không có khoảng trống hoặc nhận xét trong regex.

+0

Cảm ơn bạn vì điều đó giải thích rõ ràng. –

+1

nó có thể có giá trị một chỉnh sửa đề cập đến rằng bạn có thể nhận được điều này thông qua 'perldoc perlre'; ngay cả trên trang đầu tiên! – leander

5

Trong trường hợp sử dụng này 'x' là công cụ sửa đổi regex, "Mở rộng khả năng hiển thị của mẫu của bạn bằng cách cho phép khoảng trắng và nhận xét". theo tài liệu perl. Tuy nhiên, có vẻ như dư thừa ở đây

+2

Không phải là "dư thừa" nhưng "không cần thiết". –

+3

@clintp: và sự khác biệt giữa dư thừa (có nghĩa là 'không cần thiết') và không cần thiết là gì? –

+1

'dư thừa' không đơn giản có nghĩa là 'không cần thiết'. Nó có nghĩa là 'không cần thiết vì một cái gì đó khác phục vụ cùng một mục đích'. Trong trường hợp này, không có gì khác nói cho regex bỏ qua khoảng trắng/bình luận. Không có bất kỳ khoảng trống/nhận xét nào, vì vậy không cần phải bỏ qua chúng. – pkaeding

6

"x" trong trường hợp đầu tiên của bạn, là toán tử lặp lại, lấy chuỗi làm đối số bên trái và số lần lặp lại làm đối số chính xác. Perl6 có thể tái tạo danh sách bằng cách sử dụng toán tử lặp lại "xx".

Ví dụ thứ hai của bạn sử dụng cụm từ thông dụng m{^a}x. Mặc dù bạn có thể sử dụng nhiều loại dấu phân cách khác nhau, nhưng có thể sử dụng ký pháp quen thuộc, sử dụng dấu gạch chéo phía trước: m/^a/x

"x" trong regex được gọi là công cụ sửa đổi hoặc cờ và là một trong nhiều cờ tùy chọn có thể được sử dụng. Nó được sử dụng để bỏ qua khoảng trống trong mẫu regex, nhưng nó cũng cho phép sử dụng bình luận bình thường bên trong. Bởi vì các mẫu regex có thể thực sự dài và khó hiểu, việc sử dụng khoảng trắng và nhận xét rất hữu ích.

Ví dụ của bạn rất ngắn (tất cả là chữ cái đầu tiên của dòng bắt đầu bằng "a"), vì vậy bạn có thể không cần khoảng trắng hoặc nhận xét, nhưng bạn có thể nếu bạn muốn.


Ví dụ:

m/^a  # first letter is an 'a' 
     # <-- you can put more regex on this line because whitespace is ignored 
     # <-- and more here if you want 
/x 
+0

cảm ơn vol7ron, tôi không biết bạn có thể đưa ý kiến ​​vào regex –