Cú pháp << 'm' = ~ m >> trong perl có nghĩa là gì?


82

Vì vậy, tôi hiểu rằng perl có nhiều cú pháp bất thường, nhưng tôi đã xem một đoạn mã tại nơi làm việc vào ngày hôm đó khiến tôi bối rối. Ai đó có thể vui lòng giải thích cho tôi ý nghĩa của nó không:

<<'m'=~m>>
print $a unless $b;
return;
m
;

Nó trông giống như cú pháp HEREDOC, nhưng không phải ở bất kỳ dạng nào mà tôi từng thấy.



1
Bạn có thể truy cập danh sách các toán tử và hằng số bí mật Perl tại đây .
aloisdg chuyển sang codidact.com 29/09/15

Câu trả lời:


124

Đây bí mật cú pháp được gọi là dao hai lưỡi trang trí công phu , và thường được ký hiệu là:

<<m=~m>>

Comments here

m
;

Đây là một cuộc tấn công đối với các nhận xét nhiều dòng, sử dụng cú pháp heredoc và toán tử so khớp ( =~) với >làm dấu phân cách.

Lưu ý, vì dấu gạch chéo, /không được sử dụng làm dấu phân cách để đối sánh, toán tử 'm' là bắt buộc. Ví dụ $my_var =~ /test/tương đương với $my_var =~ m>test>, ngược lại $my_var =~ >test>sẽ không hợp lệ.

Hãy chú ý đến thực tế là mký tự đầu tiên trong đoạn mã của bạn được bao bằng dấu ngoặc kép, có nghĩa là các biến $a$bsẽ không được nội suy. Nếu những dấu ngoặc kép này bị bỏ qua (theo ví dụ mã được cung cấp của tôi) thì perl sẽ tự động thêm dấu ngoặc kép vào điểm đánh dấu cuối và bất kỳ biến nào tiếp theo sẽ được nội suy. Điều này sẽ gây ra sự cố nếu $a$bkhông còn được xác định và bạn đang sử dụng use warnings;.

Để làm cho ví dụ về lưỡi kép được trang trí công phu ở trên dễ hiểu hơn (nhưng vẫn không được khuyến nghị), chúng tôi có thể viết:

<<"END" =~ //

Comments here

END
;

Lưu ý rằng điều =~ //này là dư thừa, vì vậy điều này tương đương với:

<<"END";

Comments here

END

Đó chỉ là cú pháp heredoc chuẩn trong ngữ cảnh void.

Tôi không khuyên bạn nên sử dụng điều này trong mã sản xuất vì việc có một chuỗi trong ngữ cảnh void có thể gây ra sự cố. Thêm vào đó, mã này là một điều đáng kinh ngạc cho ngay cả những lập trình viên perl có kinh nghiệm nhất và rất khó đọc và bảo trì! Nếu bạn muốn tạo nhận xét nhiều dòng thích hợp thì tôi khuyên bạn nên gắn vào nhóm như được giải thích ở đây Làm cách nào để nhập nhận xét nhiều dòng trong Perl?

Hi vọng điều này sẽ làm sáng tỏ nó.


24

Chạy B :: Deparse giúp ích rất nhiều để hiểu cách perl đang xử lý đoạn mã đó (giả sử nó nằm trong tệp "test.pl"):

perl -MO=Deparse  test.pl 

cho chúng tôi thấy:

"print \$a unless \$b;\nreturn;\n" =~ //;
test.pl syntax OK

Vì vậy, như bạn có thể thấy, perl đang cố gắng khớp một regexpr trống với chuỗi này: "print \$a unless \$b;\nreturn;\n"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.