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

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

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

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

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

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


person Nick Bolton    schedule 11.01.2010    source источник


Ответы (6)


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

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

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

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

person Greg Hewgill    schedule 11.01.2010
comment
Да, используя это, вы должны быть осторожны, если это undef, и если вы используете предупреждения, вы получите предупреждение во время выполнения. Однако есть много способов обойти предупреждение. - person Evan Carroll; 12.01.2010

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

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

person hobbs    schedule 11.01.2010
comment
Я думаю, что длина — это самый близкий тест, который у нас есть для выражения идеи о том, что в строке ничего нет. - person brian d foy; 12.01.2010
comment
Проголосовал, потому что if (length($str)) - хороший подход и не терпит неудачу, если переменная не определена. - person basic6; 19.05.2015

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

if (not defined $str) {

# this variable is undefined

}
person DmitryK    schedule 11.01.2010
comment
Очень полезно, когда вы получили строку путем сдвига массива, который может содержать 0 элементов. - person Dacav; 13.11.2011

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

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

person Matthew Slattery    schedule 11.01.2010
comment
+1 Круто, да, я обычно использую use strict, но я обновляю какой-то старый код, поэтому, когда я добавляю это, я получаю сотни ошибок. Я, вероятно, исправлю их когда-нибудь. - person Nick Bolton; 12.01.2010

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

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

if($foo eq "")

or

if(length($foo) == 0)
person whatsisname    schedule 11.01.2010
comment
Верно то, что Perl не склонен отстаивать единственный верный способ решения проблем, но это не означает, что нет строго предпочитаемых идиом, стилей и подходов. Кроме того, как любит говорить один из завсегдатаев Perl, даже если существует более одного способа сделать что-то, некоторые способы сделать что-то очень, очень плохие (глупые, опрометчивые, неприхотлив в обслуживании и др.) - person Telemachus; 12.01.2010
comment
То, что есть много способов сделать это, не означает, что все способы равны. Тестирование пустых строк с использованием if ($foo == ""), например, определенно неверно, если вы на самом деле не хотите проверять, имеет ли $foo, оцениваемое в числовом контексте, значение 0 (в этом случае оно все же лучше писать как if ($foo == 0), так как это более четко выражает ваше намерение). - person Dave Sherohman; 12.01.2010

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

if (!defined $val || $val eq '')
{
    # empty
}
person Roland Ayala    schedule 06.11.2017