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

96

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

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

И то же самое с оператором не равно ...

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

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

Ник Болтон
источник

Ответы:

135

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

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

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

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

Грег Хьюгилл
источник
Да, используя это, вы должны быть осторожны, если это undef, и если вы используете предупреждения, вы получите предупреждение во время выполнения. Однако существует множество способов обойти предупреждение.
Эван Кэрролл,
92
  1. Из-за того, как строки хранятся в Perl, получение длины строки оптимизируется.
    if (length $str)- хороший способ проверить, что строка не пуста.

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

Hobbs
источник
7
Я думаю, что длина - это самый близкий тест, который у нас есть для выражения идеи о том, что в строке ничего нет.
brian d foy
6
Проголосовали за, потому что if (length($str))это хороший подход, и он не дает сбоев, если переменная не определена.
basic6
10

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

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 любит много говорить, даже если есть несколько способов делать что-то, некоторые способы делать что-то действительно очень плохие (глупые, опрометчивые, сложные в обслуживании и т. .)
Telemachus
2
То, что есть много способов сделать это, не означает, что все способы равны. if ($foo == "")Например, тестирование пустых строк с использованием , безусловно, неверно, если вы на самом деле не хотите проверять $foo, имеет ли значение 0, оцененное в числовом контексте (в этом случае его все равно лучше записать как if ($foo == 0), поскольку это более четко выражает ваше намерение).
Дэйв Шерохман
0

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

if (!defined $val || $val eq '')
{
    # empty
}
Роланд Айяла
источник