2011-09-02 48 views

Trả lời

179

Để tìm hiểu xem một chuỗi chứa substring bạn có thể sử dụng chức năng index:

if (index($str, $substr) != -1) { 
    print "$str contains $substr\n"; 
} 

Nó sẽ trở lại vị trí của sự xuất hiện đầu tiên của $substr trong $str, hoặc -1 nếu chuỗi không được tìm thấy.

+5

cách này đặc biệt preferrable, khi bạn đang tìm kiếm bằng cách sử dụng một biến - theo cách này bạn sẽ không phải nhân đôi các ký tự thoát (trong chuỗi biến này), đặc biệt cho các biểu thức chính quy (như ':'). – evgeny9

49

Một khả năng khác là sử dụng regular expressions đó là Perl là những gì nổi tiếng với:

if ($mystring =~ /s1\.domain\.com/) { 
    print qq("$mystring" contains "s1.domain.com"\n); 
} 

Dấu gạch chéo ngược là cần thiết vì một . có thể phù hợp với bất kỳ ký tự. Bạn có thể giải quyết vấn đề này bằng cách sử dụng các toán tử \Q\E.

my $substring = "s1.domain.com"; 
    if ($mystring =~ /\Q$substring\E/) { 
    print qq("$mystring" contains "$substring"\n); 
} 

Hoặc, bạn có thể làm như eugene y đã nêu và sử dụng chức năng index. Chỉ một lời cảnh báo: Chỉ số trả về một số -1 khi không thể tìm thấy kết quả phù hợp thay vì undef hoặc 0.

Như vậy, đây là một lỗi:

my $substring = "s1.domain.com"; 
if (not index($mystring, $substr)) { 
    print qq("$mystring" doesn't contains "$substring"\n"; 
} 

này sẽ là sai lầm nếu s1.domain.com là lúc bắt đầu của chuỗi của bạn. Cá nhân tôi đã bị đốt cháy nhiều lần.

+0

Tôi cho rằng 'index()' nhanh hơn regexps trong trường hợp đơn giản? –

+1

Một câu trả lời perl cố gắng cho một câu hỏi về [loại bỏ chất nền] (http://stackoverflow.com/a/35593275/2019415) - Tôi không so sánh tốc độ nhưng '= ~', 'index()', '~~' và ['match :: simple'] (https://metacpan.org/pod/match::simple) tất cả dường như có một chút 'awk'-ward ...: - \ –

+0

Bạn cũng phải đảm bảo rằng các chuỗi mà bạn đang so sánh không phân biệt chữ hoa chữ thường. S1.DOMAIN.COM sẽ không hoạt động đối với chuỗi con. Nhưng nếu bạn lc ($ givendomain), và sau đó so sánh với "s1.domain.com", thì điều đó sẽ hoạt động. Ngoài ra, chuỗi con không nhất thiết phải là cách tiếp cận đúng - xem lưu ý của tôi ở trên để phản ứng của eugene y – BlueChips23

11

case insensitive xâu Ví dụ

Đây là một phần mở rộng của câu trả lời Eugene, mà chuyển đổi chuỗi để giảm trường hợp trước khi kiểm tra cho chuỗi:

if (index(lc($str), lc($substr)) != -1) { 
    print "$str contains $substr\n"; 
} 
Các vấn đề liên quan