Как правильно проверить, является ли строка пустой в Perl?

69

Я только что использовал этот код, чтобы проверить, является ли строка пустой:

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

А также то же самое с оператором not equals...

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

Кажется, это работает (я думаю), но я не уверен, что это правильный путь, или если есть какие-то непредвиденные недостатки. Что-то просто не чувствует себя хорошо.

Теги:
string
comparison

6 ответов

103
Лучший ответ

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

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

Операторы == и != являются числовыми операторами сравнения. Они попытаются преобразовать оба операнда в целые числа, прежде чем сравнивать их.

Для получения дополнительной информации см. справочную страницу perlop.

  • 0
    Да, используя это, вы должны быть осторожны, если оно не определено, и если вы используете предупреждения, вы получите предупреждение во время выполнения. Много способов обойти предупреждение, хотя.
77
  • Из-за того, что строки хранятся в Perl, оптимизация длины строки. if (length $str) - хороший способ проверить, что строка не пуста.

  • Если вы находитесь в ситуации, когда вы еще не защитили от undef, то все-таки для "непустого", который не будет предупреждать, будет if (defined $str and length $str).

  • 5
    Я думаю, что длина является самым близким тестом, который мы имеем к выражению идеи, что в строке ничего нет.
  • 5
    Проголосовал, потому что if (length($str)) - хороший подход и не завершится ошибкой, если переменная не определена.
9

Как уже упоминалось несколькими людьми, eq - это правильный оператор.

Если вы use warnings; в своем script, вы получите предупреждения об этом (и многие другие полезные вещи); Я бы рекомендовал use strict;.

  • 0
    +1 Круто, да я обычно использую use strict но я обновляю старый код, поэтому, когда я добавляю это, я получаю сотни ошибок. Я, вероятно, исправлю их когда-нибудь.
8

Возможно, вы захотите использовать "eq" вместо "==". Если вы беспокоитесь о некоторых случаях с краем, вы также можете проверить undefined:

if (not defined $str) {

# this variable is undefined

}
  • 1
    Очень полезно, когда вы получили строку путем смещения массива, который может иметь 0 элементов.
2

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

В любом случае это числовые операторы, вы должны использовать

if($foo eq "")

или

if(length($foo) == 0)
  • 3
    Это правда, что Perl не склонен отстаивать «единственно верный путь» к решению проблем, но это не значит, что не существует особо предпочтительных идиом, стилей и подходов. Кроме того, как один из постоянных клиентов Perl любит много говорить, даже если есть несколько способов сделать что-то, некоторые способы сделать что-то действительно, очень плохо (глупо, опрометчиво, трудно поддерживать и т. Д. .)
  • 2
    То, что есть много способов сделать это, не означает, что все способы равны. Например, проверка на наличие пустых строк с использованием if ($foo == "") категорически неверна, если только вы на самом деле не хотите проверять, имеет ли значение $foo , вычисляемое в числовом контексте, значение 0 (в этом случае оно все равно будет лучше писать так, как if ($foo == 0) , так как это более ясно выражает ваше намерение).
0

Чтобы проверить пустую строку, вы также можете сделать что-то следующим образом

if (!defined $val || $val eq '')
{
    # empty
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню