Qual è il modo corretto per verificare se una stringa è vuota in Perl?


94

Ho appena usato questo codice per verificare se una stringa è vuota:

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

E anche lo stesso con l'operatore non uguale ...

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

Questo sembra funzionare (credo), ma non sono sicuro che sia il modo corretto, o se ci sono inconvenienti imprevisti. Qualcosa non sembra giusto al riguardo.

Risposte:


133

Per confronti di stringhe in Perl, usa eqo ne:

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

Gli operatori ==e !=sono operatori di confronto numerico . Tenteranno di convertire entrambi gli operandi in numeri interi prima di confrontarli.

Vedere la pagina man di perlop per maggiori informazioni.


Sì, usando questo però devi essere cauto che se è undef e se stai usando gli avvisi riceverai un avviso di runtime. Molti modi per aggirare l'avvertimento però.
Evan Carroll,

89
  1. A causa del modo in cui le stringhe vengono memorizzate in Perl, ottenere la lunghezza di una stringa è ottimizzato.
    if (length $str)è un buon modo per verificare che una stringa non sia vuota.

  2. Se ti trovi in ​​una situazione in cui non ti sei già messo in guardia undef, allora il termine "non vuoto" che non ti avverte è if (defined $str and length $str).


6
Penso che la lunghezza sia il test più vicino che abbiamo all'espressione dell'idea che non ci sia nulla nella stringa.
brian d foy

6
Upvoted perché if (length($str))è un buon approccio e non fallisce se la variabile non è definita.
basic6

10

Probabilmente vorrai usare "eq" invece di "==". Se ti preoccupi per alcuni casi limite, potresti anche voler controllare non definito:

if (not defined $str) {

# this variable is undefined

}

1
Molto utile quando hai ottenuto la stringa spostando un array che può avere 0 elementi.
Dacav

9

Come già accennato da diverse persone, qui eqè l'operatore giusto.

Se sei use warnings;nel tuo script, riceverai avvertimenti su questo (e su molte altre cose utili); Lo consiglierei anch'io use strict;.


+1 Fantastico, sì, normalmente uso use strictma sto aggiornando un vecchio codice, quindi quando aggiungo questo ottengo centinaia di errori. Probabilmente un giorno li aggiusterò.
Nick Bolton,

4

Il concetto stesso di un modo "corretto" di fare qualsiasi cosa, a parte l'uso di CPAN, è inesistente in Perl.

Comunque quelli sono operatori numerici, dovresti usare

if($foo eq "")

o

if(length($foo) == 0)

3
È vero che Perl non tende a sostenere l '"unica vera via" per la risoluzione dei problemi, ma ciò non significa che non ci siano idiomi, stili e approcci fortemente preferiti. Inoltre, come uno dei clienti abituali del Perl ama dire molto, anche se c'è più di un modo di fare le cose, alcuni modi per fare le cose sono davvero, davvero pessimi (stupidi, sconsiderati, difficili da mantenere, ecc. .)
Telemaco

2
Solo perché ci sono molti modi per farlo non significa che tutti i modi siano uguali. Testare stringhe vuote usando if ($foo == ""), ad esempio, è definitivamente sbagliato a meno che tu non intenda effettivamente testare se $foo, valutato in un contesto numerico, ha un valore di 0 (nel qual caso sarebbe ancora meglio scrivere come if ($foo == 0), in quanto esprime più chiaramente il tuo intento).
Dave Sherohman

0

Per verificare la presenza di una stringa vuota potresti anche fare qualcosa come segue

if (!defined $val || $val eq '')
{
    # empty
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.