ฉันจะตรวจสอบได้อย่างไรว่าสตริงที่ระบุมีสตริงย่อยโดยใช้ Perl หรือไม่
โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าs1.domain.comมีอยู่ในตัวแปรสตริงที่กำหนดหรือไม่
ฉันจะตรวจสอบได้อย่างไรว่าสตริงที่ระบุมีสตริงย่อยโดยใช้ Perl หรือไม่
โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าs1.domain.comมีอยู่ในตัวแปรสตริงที่กำหนดหรือไม่
คำตอบ:
หากต้องการทราบว่าสตริงมีสตริงย่อยหรือไม่คุณสามารถใช้indexฟังก์ชัน:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
มันจะส่งคืนตำแหน่งของการเกิดครั้งแรกของ$substrin $strหรือ -1 หากไม่พบสตริงย่อย
ความเป็นไปได้อีกประการหนึ่งคือการใช้นิพจน์ทั่วไปซึ่งเป็นสิ่งที่ Perl มีชื่อเสียง:
if ($mystring =~ /s1\.domain\.com/) {
print qq("$mystring" contains "s1.domain.com"\n);
}
จำเป็นต้องใช้แบ็กสแลชเนื่องจาก.สามารถจับคู่อักขระใดก็ได้ คุณสามารถแก้ไขปัญหานี้ได้โดยใช้ตัวดำเนินการ\Qและ\E
my $substring = "s1.domain.com";
if ($mystring =~ /\Q$substring\E/) {
print qq("$mystring" contains "$substring"\n);
}
หรือคุณสามารถทำตามที่ยูจีนปีที่ระบุไว้และใช้ดัชนีฟังก์ชั่น เพียงแค่คำเตือน: ดัชนีส่งกลับ-1เมื่อไม่สามารถพบการแข่งขันแทนหรือundef0
ดังนั้นนี่คือข้อผิดพลาด:
my $substring = "s1.domain.com";
if (not index($mystring, $substr)) {
print qq("$mystring" doesn't contains "$substring"\n";
}
สิ่งนี้จะผิดหากs1.domain.comอยู่ที่จุดเริ่มต้นของสตริงของคุณ ฉันเองถูกไฟไหม้มากกว่าหนึ่งครั้ง
index()เร็วกว่า regexps ในกรณีง่ายๆ?
=~, index(), ~~และmatch::simpleทั้งหมดดูเหมือนบิตawk-ward ... : - \
domain.comจับคู่subdomain.domain.comโดยใช้ REGEX ด้านบนได้มีความคิดอย่างไร?
ตัวอย่างสตริงย่อยที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
นี่คือส่วนขยายของคำตอบของ Eugene ซึ่งจะแปลงสตริงเป็นตัวพิมพ์เล็กก่อนที่จะตรวจสอบสตริงย่อย:
if (index(lc($str), lc($substr)) != -1) {
print "$str contains $substr\n";
}
:)