ฉันจะตรวจสอบได้อย่างไรว่าสตริงที่ระบุมีสตริงย่อยโดยใช้ Perl หรือไม่
โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าs1.domain.com
มีอยู่ในตัวแปรสตริงที่กำหนดหรือไม่
ฉันจะตรวจสอบได้อย่างไรว่าสตริงที่ระบุมีสตริงย่อยโดยใช้ Perl หรือไม่
โดยเฉพาะอย่างยิ่งฉันต้องการดูว่าs1.domain.com
มีอยู่ในตัวแปรสตริงที่กำหนดหรือไม่
คำตอบ:
หากต้องการทราบว่าสตริงมีสตริงย่อยหรือไม่คุณสามารถใช้index
ฟังก์ชัน:
if (index($str, $substr) != -1) {
print "$str contains $substr\n";
}
มันจะส่งคืนตำแหน่งของการเกิดครั้งแรกของ$substr
in $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
เมื่อไม่สามารถพบการแข่งขันแทนหรือundef
0
ดังนั้นนี่คือข้อผิดพลาด:
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";
}
:
)