2013-05-08 29 views
22

Các bạn có biểu thức chính quy này trong Perl mà tôi không hiểu.Việc sử dụng ký hiệu và cụm từ thông dụng trong Perl

s/\w+$/($`!)$&/; 

Chuỗi ban đầu là

"huge dinosaur" 

Sau đó biểu thức chính quy được thực thi, chuỗi bây giờ là:

"huge (huge !)dinosaur" 

tôi khá không hiểu làm thế nào mà đã xảy ra. Và tôi không hiểu những gì dấu và đang làm ở đó. Tôi hiểu $ `, nhưng tại sao nó ở đó, từ những gì tôi biết $` lấy giá trị trước trận đấu, tôi nghĩ không có gì bởi vì không có biểu thức phù hợp trước biểu thức chính quy trên.

Nếu ai đó có thể liên kết tôi với một số hướng dẫn rất hữu ích về biểu thức chính quy trên Perl thì thực sự được đánh giá cao.

Cảm ơn

EDIT: Tôi hiểu bây giờ những gì các phương tiện dấu và, nó tiết kiệm trận đấu và $ 'tiết kiệm giá trị trước trận đấu, Bây giờ những gì tôi không hiểu nữa là toàn bộ phần này:

($`!)$& 

cách thực hiện phần việc này đã trở thành

(huge !) 
+1

Google 'perlvar' và sau đó thực hiện tìm kiếm cho' $ & '. Đó là một khởi đầu khó khăn. – squiguy

+0

Bit trong phần thứ hai của s /// chỉ là một chuỗi kép được trích dẫn. –

+0

@squiguy Có (thực sự) chỉ một (bán -) "chính thức" url cho http://perldoc.perl.org/perlvar.html#%24%26 –

Trả lời

25

Bạn đúng, $` là một biến đặc biệt mà giữ các nội dung trước khi đấu. $& là tương tự, nhưng giữ những gì đã được kết hợp và $' nắm giữ những gì là sau trận đấu.

Trong "huge dinosaur", /\w+$/ khớp với dinosaur. Vì vậy, các nội dung biến là:

$` => "huge " 
$& => "dinosaur" 
$' => "" 

Lưu ý rằng những gì đã xuất hiện là dinosaur. Sau đó, thay thế phần dinosaur của chuỗi có dấu mở đầu, "huge ", dấu chấm than, đóng dấu ngoặc và cuối cùng là dinosaur (nội dung được khớp).

Kiểm tra tài liệu Perl cho perlvarperlre.

+1

Cảm ơn bạn đã xóa tất cả cho tôi. – ruggedbuteducated

+0

Xin lỗi vì đã trở thành người theo dõi nhưng tôi đã rất lo lắng khi thấy rằng '$ \' 'không kết thúc với hai không gian. Đây có phải là một sai lầm hoặc là có cái gì tôi đang mất tích? –

+0

@StevenLu lỗi của tôi, đánh máy hai lần trong cụm từ gốc, xin lỗi! Và cảm ơn vì đã chú ý – sidyll

16

$& (đô la và) nắm giữ toàn bộ kết hợp regex.

$' (đô la theo sau là dấu nháy đơn hoặc dấu nháy đơn) giữ một phần của chuỗi sau (ở bên phải) kết hợp regex.

$` (đồng đô la ngược) giữ một phần của chuỗi trước (ở bên trái) kết hợp regex.

Mọi chi tiết, xin vui lòng tham khảo ý kiến ​​http://www.regular-expressions.info/perl.html

+1

Tôi đã tìm ra cách bao gồm một backtick trong một codepan và lấy sự tự do để chỉnh sửa câu trả lời của bạn, tôi hy vọng bạn không nhớ. Bạn phải bắt đầu và kết thúc mã vạch với backticks đôi, và để lại một không gian trước khi đóng một để tách backtick của nhân vật từ những đóng cửa ... khó hiểu! – sidyll

+0

Vâng, tôi đã không chắc chắn làm thế nào để làm điều đó. Cảm ơn! –

Các vấn đề liên quan