Qual é a maneira correta de verificar se uma string está vazia em Perl?

94

Acabei de usar este código para verificar se uma string está vazia:

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

E também o mesmo com o operador diferente de ...

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

Isso parece funcionar (eu acho), mas não tenho certeza se é a maneira correta, ou se há alguma desvantagem imprevista. Algo simplesmente não parece certo sobre isso.

Nick Bolton
fonte

Respostas:

133

Para comparações de strings em Perl, use eqou ne:

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

Os operadores ==e !=são operadores de comparação numérica . Eles tentarão converter ambos os operandos em inteiros antes de compará-los.

Veja a página de manual do perlop para mais informações.

Greg Hewgill
fonte
Sim, embora usando isso, você precisa ter cuidado, pois se for undef e se estiver usando avisos, você receberá um aviso de tempo de execução. Muitas maneiras de contornar o aviso.
Evan Carroll
89
  1. Devido à maneira como as strings são armazenadas em Perl, obter o comprimento de uma string é otimizado.
    if (length $str)é uma boa maneira de verificar se uma string não está vazia.

  2. Se você estiver em uma situação contra a qual ainda não se protegeu undef, o ponto-chave para "não vazio" que não avisará é if (defined $str and length $str).

hobbs
fonte
6
Acho que o comprimento é o teste mais próximo que temos da expressão da ideia de que não há nada na string.
brian d foy
6
Votado porque if (length($str))é uma boa abordagem e não falha se a variável não for definida.
básico 6 de
10

Você provavelmente deseja usar "eq" em vez de "==". Se você se preocupa com alguns casos extremos, também pode querer verificar se há indefinido:

if (not defined $str) {

# this variable is undefined

}
DmitryK
fonte
1
Muito útil quando você obteve a string deslocando um array que pode ter 0 elementos.
Dacav
9

Como já mencionado por várias pessoas, eqé a operadora certa aqui.

Se você estiver use warnings;em seu script, receberá avisos sobre isso (e muitas outras coisas úteis); Eu também recomendaria use strict;.

Matthew Slattery
fonte
+1 Legal, sim, eu normalmente uso, use strictmas estou atualizando alguns códigos antigos, então quando adiciono isso obtenho centenas de erros. Provavelmente vou consertá-los algum dia.
Nick Bolton
4

O próprio conceito de uma maneira "adequada" de fazer qualquer coisa, além de usar o CPAN, não existe no Perl.

De qualquer forma, esses são operadores numéricos, você deve usar

if($foo eq "")

ou

if(length($foo) == 0)
como se chama
fonte
3
É verdade que Perl não tende a defender o "único caminho verdadeiro" para a solução de problemas, mas isso não significa que não existam idiomas, estilos e abordagens fortemente preferidos. Além disso, como um dos regulares do Perl gosta de dizer muito, mesmo que haja mais de uma maneira de fazer as coisas, algumas maneiras de fazer as coisas são muito, muito ruins (estúpidas, imprudentes, difíceis de manter, etc. .)
Telemachus
2
Só porque existem muitas maneiras de fazer isso, não significa que todas as formas são iguais. Testar strings vazias usando if ($foo == ""), por exemplo, é definitivamente errado, a menos que você realmente queira testar se $foo, avaliado em contexto numérico, tem um valor de 0 (caso em que ainda seria melhor escrito como if ($foo == 0), já que expressa mais claramente seu intenção).
Dave Sherohman
0

Para verificar se há uma string vazia, você também pode fazer algo da seguinte maneira

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