2012-07-13 33 views
6

Tôi có một tập lệnh Perl đọc tìm kiếm regex và thay thế các giá trị từ tệp INI.Perl: chuyển tìm kiếm regex và thay thế bằng các biến

Tính năng này hoạt động tốt cho đến khi tôi cố gắng sử dụng các biến chụp ($ 1 hoặc \ 1). Chúng được thay thế theo nghĩa đen với $ 1 hoặc \ 1.

Bất kỳ ý tưởng nào về cách tôi có thể nhận chức năng chụp này để chuyển các bit regex qua các biến? mã ví dụ (không sử dụng một tập tin này) ...

$test = "word1 word2 servername summary message"; 

$search = q((\S+)\s+(summary message)); 
$replace = q(GENERIC $4); 

$test =~ s/$search/$replace/; 
print $test; 

Điều này dẫn đến ...

word1 word2 GENERIC $4 

KHÔNG

word1 word2 GENERIC summary message 

nhờ

+0

mẫu tìm kiếm của bạn sẽ không thành công, có **!: ** ở cuối mẫu tìm kiếm nhưng không nằm trong chuỗi. – tuxuday

+0

xin lỗi sai về phần của tôi,!: Đáng lẽ phải bị loại bỏ khỏi ví dụ – andyml73

Trả lời

6

Sử dụng đánh giá kép:

$search = q((\S+)\s+(summary message)); 
$replace = '"GENERIC $1"'; 

$test =~ s/$search/$replace/ee; 

Lưu ý hai dấu ngoặc kép trong $replaceee ở cuối s///.

+0

thực hiện thủ thuật, cổ vũ – andyml73

-1

Sử dụng \ 4, không phải $ 4.

$ 4 không có ý nghĩa đặc biệt trong q(), cũng như RE engine không nhận ra nó.

\ 4 có ý nghĩa đặc biệt đối với động cơ RE.

+0

Arkadiy, điều đó sẽ không giúp ích gì cả. Bạn cần bước đánh giá bổ sung. –

+0

Oh crep - Tôi nghĩ perl có nội suy biến đổi và sau đó áp dụng cú pháp RE - Tôi đoán tôi đã sai và các giá trị của các biến được coi là chữ. Cảm ơn đã chỉ ra điều đó. – Arkadiy

0

thử chịu các regex-sub để eval, được cảnh báo rằng việc thay đổi xuất phát từ tập tin bên ngoài

eval "$test =~ s/$search/$replace/"; 
0

Một giải pháp thú vị sẽ sử dụng look-aheads (?=PATTERN)

dụ của bạn sau đó sẽ chỉ thay thế những gì cần phải được thay thế:

$test = "word1 word2 servername summary message"; 

# repl. only ↓THIS↓ 
$search = qr/\S+\s+(?=summary message)/; 
$replace = q(GENERIC); 

$test =~ s/$search/$replace/; 
print $test; 
+0

Tôi thích nó, điều này có thể thanh lịch hơn, cảm ơn – andyml73

0

Nếu bạn thích giải pháp amon, tôi giả định rằng "Generic $ 1" không phải là cấu hình (especia lly phần '$ 1' trong đó). Trong trường hợp đó, tôi nghĩ rằng có một giải pháp đơn giản hơn mà không cần sử dụng giao diện:

$test = "word1 word2 servername summary message"; 
$search = qr/\S+\s+(summary message)/; 
$replace = 'GENERIC'; 
$test =~ s/$search/$replace $1/; 

Mặc dù không có gì thực sự xấu về (? = PATTERN).

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