วิธีที่เหมาะสมในการตรวจสอบว่าสตริงว่างเปล่าใน Perl คืออะไร?


98

ฉันเพิ่งใช้รหัสนี้เพื่อตรวจสอบว่าสตริงว่างเปล่า:

if ($str == "")
{
  // ...
}

และเช่นเดียวกันกับตัวดำเนินการ not equals ...

if ($str != "")
{
  // ...
}

ดูเหมือนจะได้ผล (ฉันคิดว่า) แต่ฉันไม่แน่ใจว่าเป็นวิธีที่ถูกต้องหรือมีข้อบกพร่องที่ไม่คาดคิด มีบางอย่างไม่ถูกต้องเกี่ยวกับมัน

คำตอบ:


136

สำหรับการเปรียบเทียบสตริงใน Perl ให้ใช้eqหรือne:

if ($str eq "")
{
  // ...
}

ตัวดำเนินการ==และ!=เป็นตัวดำเนินการเปรียบเทียบตัวเลข พวกเขาจะพยายามแปลงตัวถูกดำเนินการทั้งสองเป็นจำนวนเต็มก่อนที่จะเปรียบเทียบกัน

ดูหน้า man perlopสำหรับข้อมูลเพิ่มเติม


ใช่แล้วการใช้สิ่งนี้แม้ว่าคุณจะต้องระมัดระวังว่าหากเป็น undef และหากคุณใช้คำเตือนคุณจะได้รับคำเตือนรันไทม์ หลายวิธีในการหลีกเลี่ยงคำเตือน
Evan Carroll

94
  1. เนื่องจากวิธีการจัดเก็บสตริงใน Perl การรับความยาวของสตริงจึงถูกปรับให้เหมาะสม
    if (length $str)เป็นวิธีที่ดีในการตรวจสอบว่าสตริงไม่ว่างเปล่า

  2. ถ้าคุณอยู่ในสถานการณ์ที่คุณไม่ได้เตรียมพร้อมอยู่แล้วกับundefแล้วจับทั้งหมดสำหรับ "ไม่ว่าง" if (defined $str and length $str)ที่จะไม่เตือนมี


7
ฉันคิดว่าความยาวนั้นเป็นการทดสอบที่ใกล้เคียงที่สุดที่เรามีในการแสดงออกของความคิดว่าไม่มีอะไรอยู่ในสตริง
brian d foy

6
โหวตขึ้นเพราะif (length($str))เป็นแนวทางที่ดีและไม่ล้มเหลวหากไม่ได้กำหนดตัวแปร
พื้นฐาน 6

10

คุณอาจต้องการใช้ "eq" แทน "==" หากคุณกังวลเกี่ยวกับขอบบางกรณีคุณอาจต้องการตรวจสอบที่ไม่ได้กำหนด:

if (not defined $str) {

# this variable is undefined

}

1
มีประโยชน์มากเมื่อคุณได้รับสตริงโดยการเปลี่ยนอาร์เรย์ซึ่งอาจมี 0 องค์ประกอบ
Dacav

9

ดังที่หลายคนกล่าวไว้แล้วว่าeqเป็นตัวดำเนินการที่เหมาะสมที่นี่

หากคุณuse warnings;อยู่ในสคริปต์ของคุณคุณจะได้รับคำเตือนเกี่ยวกับสิ่งนี้ (และสิ่งที่มีประโยชน์อื่น ๆ อีกมากมาย) ฉันขอแนะนำuse strict;เช่นกัน


+1 เจ๋งใช่ฉันใช้ปกติuse strictแต่ฉันกำลังอัปเดตโค้ดเก่าดังนั้นเมื่อฉันเพิ่มสิ่งนี้ฉันได้รับข้อผิดพลาดหลายร้อยข้อ ฉันอาจจะแก้ไขได้สักวัน
Nick Bolton

4

แนวคิดของวิธีที่ "เหมาะสม" ในการทำอะไรก็ตามนอกเหนือจากการใช้ CPAN นั้นไม่มีอยู่ใน Perl

อย่างไรก็ตามสิ่งเหล่านี้เป็นตัวดำเนินการตัวเลขคุณควรใช้

if($foo eq "")

หรือ

if(length($foo) == 0)

3
เป็นความจริงที่ว่า Perl ไม่ได้สนับสนุน "วิธีเดียวที่แท้จริง" ในการแก้ปัญหา แต่นั่นไม่ได้หมายความว่าไม่มีสำนวนและรูปแบบและแนวทางที่ต้องการอย่างมาก นอกจากนี้ในฐานะที่เป็นหนึ่งในคนประจำของ Perl ชอบพูดมากแม้ว่าจะมีวิธีทำมากกว่าหนึ่งวิธี แต่บางวิธีในการทำสิ่งต่างๆนั้นแย่มากจริงๆ (โง่, ไม่ได้รับคำแนะนำ, ดูแลรักษายาก ฯลฯ .)
Telemachus

2
เพียงเพราะมีหลายวิธีในการทำไม่ได้หมายความว่าทุกวิธีจะเท่าเทียมกัน if ($foo == "")ตัวอย่างเช่นการทดสอบสตริงว่างโดยใช้มีความผิดอย่างแน่นอนเว้นแต่คุณจะตั้งใจทดสอบว่า$fooประเมินในบริบทตัวเลขมีค่าเป็น 0 หรือไม่ (ซึ่งในกรณีนี้จะยังคงเขียนได้ดีกว่าเนื่องจากif ($foo == 0)เป็นการแสดงออกที่ชัดเจนยิ่งขึ้น เจตนา).
Dave Sherohman

0

หากต้องการตรวจสอบสตริงว่างคุณสามารถทำสิ่งต่อไปนี้ได้

if (!defined $val || $val eq '')
{
    # empty
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.