บทความก่อนนี้ กระผมได้กล่าวถึงวิธีการใช้ Expression ซึ่งสามารถนำไปเป็นรูปแบบในการค้นหาได้ ไม่ว่าจะเป็นการค้นหาคำ ตัวเลข หรืออะไรก็ตามที่เราต้องการ แต่ในบทนี้เป็นเรื่องเกี่ยวเนื่องกับ Expression นั่นคือ Subexpression คือการใส่ Expression เพื่อทำการค้นหาหลายเงื่อนไขโดยที่แต่ละคำที่ใช้ในการค้นหาต้องถูกคั่นด้วยสัญลักษณ์ | (pipe) เรามาลองดูวิธีการใช้งานกันดีกว่าครับ
ผู้อ่านอาจจะไม่เข้าใจสักเท่าไร ดังนั้นเรามาดูตัวอย่างแรกกันเลยดีกว่าครับ เป็นการค้นหาคำหลาย ๆ คำในตัวแปรอะเรย์
@email_lines = ("Dear idiot:",
"I hate you, you twit. You're dope",
"I bet you mistreat your llama.",
"signed, Doug.");
for $check_line(@email_lines) {
if ($check_line =~ /idiot|dope|twit|llama/) {
print "Be careful This line might contain something offensive:\n",
$check_line, "\n";
}
}
# หมายความว่าในแต่ละสมาชิกแต่ละตัวของ @email_lines
# จะต้องมีคำว่า idiot หรือ dope หรือ twit หรือ llama ก็ได้
เราสามารถบอกคำที่เราค้นหาเจอได้ โดยต้องใส่ regular expression เหล่านี้ไว้ภายใน () โดยเมื่อ String นั้น ๆ match กับคำไหนใน regular expression คำนั้น ๆ จะถูกเก็บไว้ในตัวแปร $1, $2, ...
for $check_line(@email_line) {
if ($check_line =~ /idiot|dope|twit|llama/) {
print "Be careful this line contains the offensive word $1:\n",
$check_line, "\n";
}
}
ถ้า regular expression มีมากกว่า 1 subexpression ผลที่ได้จะเก็บไว้ในตัวแปร $1, $2, $3, ...
$name = "Wall, Larry";
$name = /(\w+), (\w+)/; # $1 = Wall, $2 = Larry
สามารถใช้ subexpression ซ้อนกันได้ โดยนัยสำคัญจะเรียงจากซ้ายไปขวา
$string = "The time is 12:25:30 and I'm hungry.";
$string = /((\d{1,2}):(\d{2}):(\d{2}))/;
@time = ($1, $2, $3, $4);
# ** วงเล็บนอกสุดจะเก็บไว้ในตัวแปร $1
# ** จากนั้นวงเล็บต่อ ๆ มาก็จะเก็บไว้ใน $2, $3, $4
# @time = ("12:25:30", "12", "25", "30")
นอกจากจะเก็บเป็นตัวแปรอะเรย์แล้วยังสามารถเก็บเป็นตัวแปรธรรมดาได้ เช่น
($time, $hour, $minute, $second) = ($1, $2, $3, $4);
# หรือจะเขียนแบบย่อ ๆ ได้ดังนี้
($time, $hour, $minute, $second) =~ /((\d{1,2}):(\d{2}):(\d{2}))/;
Login
Search