Câu trả lời:
Để tìm hiểu xem một chuỗi có chứa chuỗi con hay không, bạn có thể sử dụng indexhàm:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
Nó sẽ trả về vị trí của lần xuất hiện đầu tiên của $substrin $strhoặc -1 nếu không tìm thấy chuỗi con.
Một khả năng khác là sử dụng các biểu thức chính quy mà Perl nổi tiếng:
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ể khớp với bất kỳ ký tự nào. Bạn có thể giải quyết vấn đề này bằng cách sử dụng toán tử \Qvà \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 hàm chỉ mục . Chỉ là một lời cảnh báo: Chỉ mục trả về a -1khi nó không thể tìm thấy kết quả phù hợp thay vì undefhoặc 0.
Do đó, đây là một lỗi:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
Điều này sẽ sai nếu s1.domain.comnằm ở đầu chuỗi của bạn. Cá nhân tôi đã bị đốt cháy về điều này hơn một lần.
index()là nhanh hơn regexps trong trường hợp đơn giản?
=~, index(), ~~và match::simpletất cả dường như một chút awk-ward ...: - \
domain.comkhớp subdomain.domain.combằng REGEX ở trên, có ý kiến gì không?
Ví dụ về chuỗi con không phân biệt chữ hoa chữ thường
Đây là phần mở rộng của câu trả lời của Eugene, chuyển đổi các chuỗi thành chữ thường trước khi kiểm tra chuỗi con:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:).