Який правильний спосіб перевірити, чи рядок порожній у Perl?


95

Я щойно використовував цей код, щоб перевірити, чи рядок порожній:

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

А також те саме з оператором не дорівнює ...

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

Здається, це працює (я думаю), але я не впевнений, що це правильний шлях, чи є якісь непередбачені недоліки. Щось у цьому просто не добре.

Відповіді:


134

Для порівняння рядків у Perl використовуйте eqабо ne:

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

Оператори ==and !=є числовими операторами порівняння. Вони спробують перетворити обидва операнди на цілі числа, перш ніж їх порівнювати.

Для отримання додаткової інформації див. Сторінку керівництва perlop .


Так, використовуючи це, хоча ви повинні бути обережними, що якщо це undef, і якщо ви використовуєте попередження, ви отримаєте попередження про час роботи. Однак існує багато способів обійти попередження.
Еван Керролл,

90
  1. Завдяки тому, що рядки зберігаються в Perl, отримання довжини рядка оптимізовано.
    if (length $str)є хорошим способом перевірити, чи рядок не є порожнім.

  2. Якщо ви потрапили в ситуацію, коли ви ще не вбереглися від них undef, тоді загалом для "непустого", що не буде попереджати, є if (defined $str and length $str).


6
Я думаю, що довжина - це найближчий тест, який ми маємо для вираження думки, що в рядку немає нічого.
brian d foy

6
Проголосував if (length($str))за хороший підхід і не зазнав невдачі, якщо змінна не визначена.
basic6

10

Можливо, ви хочете використовувати "eq" замість "==". Якщо вас турбують деякі крайні випадки, ви також можете перевірити наявність невизначених:

if (not defined $str) {

# this variable is undefined

}

1
Дуже корисно, коли ви отримали рядок шляхом зсуву масиву, який може мати 0 елементів.
Dacav

9

Як уже згадували кілька людей, eq є правильний оператор.

Якщо ви use warnings;введете свій сценарій, ви отримаєте попередження щодо цього (та багатьох інших корисних речей); Я б також рекомендував use strict;.


+1 Класно, так, я звичайно використовую, use strictале я оновлюю старий код, тому, додаючи це, я отримую сотні помилок. Я, мабуть, колись виправлю їх.
Нік Болтон,

4

Сама концепція "належного" способу робити що-небудь, крім використання CPAN, у Perl відсутня.

У будь-якому випадку це числові оператори, вам слід скористатися

if($foo eq "")

або

if(length($foo) == 0)

3
Це правда, що Perl не схильний відстоювати "єдиний істинний шлях" до вирішення проблем, але це не означає, що немає вкрай бажаних ідіом, стилів і підходів. Крім того, як любить говорити багато хто із постійних клієнтів Perl, навіть якщо існує кілька способів робити щось, деякі способи робити це дійсно дуже погано (дурний, необдуманий, важкий в обслуговуванні тощо). .)
Телемах

2
Те, що існує багато способів це зробити, не означає, що всі шляхи рівні. if ($foo == "")Наприклад, тестування порожніх рядків , безумовно , є неправильним, якщо ви насправді не хочете перевіряти, чи $fooмає значення 0, обчислюване в числовому контексті (у цьому випадку все- таки краще писати як if ($foo == 0), оскільки це чіткіше виражає вашу намір).
Dave Sherohman

0

Щоб перевірити наявність порожнього рядка, ви також можете зробити наступне

if (!defined $val || $val eq '')
{
    # empty
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.