2009-11-02 28 views
11

Nếu tôi có toán tử đối sánh, làm cách nào để lưu các phần của chuỗi được ghi trong dấu ngoặc đơn trong các biến thay vì sử dụng $1, $2, v.v.Làm cách nào để trích xuất các kết quả phù hợp từ toán tử đối sánh Perl thành các biến?

... = m/stuff (.*) stuff/; 

Điều gì xảy ra bên trái?

+0

Tôi đã thay thế hoàn toàn câu hỏi dựa trên nhận xét của joachim về các câu trả lời khác. Nó không phải là một câu hỏi regex. –

+0

Với cụm từ câu hỏi như vậy, có vẻ như bạn đã downvoted câu trả lời của tôi. – innaM

+0

@brian, chỉnh sửa của bạn có lẽ ngắn gọn hơn, vì câu hỏi của tôi hoàn toàn về cú pháp để sử dụng với và xung quanh toán tử m // chứ không phải là bất kỳ điều gì cần làm với chính regexp. Lỗi của tôi. Nhưng tôi muốn đặt từ 'trích xuất' trở lại trong đó một nơi nào đó, vì đó là những gì tôi sẽ google cho khi tôi quên làm thế nào để làm điều này! – joachim

Trả lời

29

Bí quyết là để làm cho công việc m // trong danh sách bối cảnh bằng cách sử dụng một giao danh sách:

($interesting) = $string =~ m/(interesting)/g; 

Điều này có thể gọn gàng mở rộng để lấy những thứ nhiều hơn, ví dụ:

($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g; 
+0

Đúng. Mặc dù bit tôi luôn gặp khó khăn là cú pháp đưa các công cụ vào các biến được đặt tên, chứ không phải là mặt regexp của mọi thứ, vì vậy tôi đã bỏ qua phần regexp của ví dụ và câu trả lời. – joachim

+0

[Ngoài ra] (https://perlmaven.com/how-to-extract-strings-from-a-file) '@interesting = $ string ...'? –

3

Thông thường bạn cũng muốn thực hiện kiểm tra để đảm bảo chuỗi đầu vào khớp với cụm từ thông dụng của bạn. Bằng cách đó bạn cũng có thể xử lý các trường hợp lỗi.

Để trích xuất nội dung nào đó thú vị, bạn cũng cần phải có một số cách để neo bit bạn quan tâm đến việc trích xuất.

Như vậy, với ví dụ của bạn, điều này sẽ trước tiên hãy chắc chắn rằng các chuỗi đầu vào phù hợp với biểu hiện của chúng tôi, và sau đó trích xuất các bit giữa hai bit 'nhàm chán':

$input = "boring interesting boring"; 
if($input =~ m/boring (.*) boring/) { 
    print "The interesting bit is $1\n"; 
} 
else { 
    print "Input not correctly formatted\n"; 
} 
8

Sử dụng bracketing xây dựng (...) để tạo ra một bộ đệm chụp. Sau đó, sử dụng các biến đặc biệt $1, $2, v.v. để truy cập chuỗi đã ghi.

if (m/(interesting)/) { 
    my $captured = $1; 
} 
+0

Bạn ** không cần nhóm chụp ** khi bạn muốn toàn bộ biểu thức. ** Chỉ cần sử dụng '$ 0'.** –

+5

@Peter: Tôi nghĩ bạn phải nhầm lẫn $ 0, tên của chương trình hiện tại, với một thứ khác. –

+0

... với một cái gì đó hoàn toàn khác, trên thực tế. – innaM

0

$ & - Chuỗi kết hợp bởi cuối cùng thành công mô hình phù hợp (không kể bất kỳ trận đấu ẩn trong một BLOCK hoặc eval() được bao bọc bởi các BLOCK hiện hành).

#! /usr/bin/perl 

use strict; 
use warnings; 

my $interesting; 
my $string = "boring interesting boring"; 
$interesting = $& if $string =~ /interesting/; 
+4

Không sử dụng $ &. Đặc biệt trong trường hợp này, nếu bạn phù hợp với văn bản theo nghĩa đen, bạn không cần phải phù hợp với tất cả. Bạn đã biết câu trả lời mà không có $ &. –

2

Bạn có thể sử dụng bộ đệm chụp tên:

if (/ (?<key> .+?) \s* : \s* (?<value> .+) /x) { 
    $hash{$+{key}} = $+{value}; 
} 
1

@strings đi bên trái và sẽ chứa kết quả, sau đó đi chuỗi đầu vào của bạn $input_string. Đừng quên cờ g để phù hợp với tất cả các chất nền.

my @strings=$input_string=~m/stuff (.*) stuff/g; 
Các vấn đề liên quan