Jaki jest właściwy sposób sprawdzenia, czy ciąg jest pusty w Perlu?

96

Właśnie użyłem tego kodu, aby sprawdzić, czy ciąg jest pusty:

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

To samo dotyczy operatora nie równa się ...

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

Wydaje się, że to działa (tak mi się wydaje), ale nie jestem pewien, czy jest to właściwy sposób lub czy są jakieś nieprzewidziane wady. Coś po prostu nie pasuje do tego.

Nick Bolton
źródło

Odpowiedzi:

135

Aby porównać ciągi znaków w Perlu, użyj eqlub ne:

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

==I !=operatorzy są liczbowe operatory porównania. Będą próbować przekonwertować oba operandy na liczby całkowite przed ich porównaniem.

Zobacz stronę podręcznika perlop, aby uzyskać więcej informacji.

Greg Hewgill
źródło
Tak, używając tego, musisz jednak uważać, jeśli jest to undef, a jeśli używasz ostrzeżeń, otrzymasz ostrzeżenie w czasie wykonywania. Jednak istnieje wiele sposobów obejścia tego ostrzeżenia.
Evan Carroll,
92
  1. Ze względu na sposób, w jaki łańcuchy są przechowywane w Perlu, optymalizowane jest pobieranie długości łańcucha.
    if (length $str)to dobry sposób na sprawdzenie, czy łańcuch nie jest pusty.

  2. Jeśli jesteś w sytuacji, przed którą jeszcze się nie broniłeś undef, to nie ostrzeże Cię „niepuste” if (defined $str and length $str).

Hobbs
źródło
7
Myślę, że długość jest najbliższym testem, jaki mamy, do wyrażenia idei, że w ciągu nie ma nic.
brian d foy
6
Uznano za, ponieważ if (length($str))jest to fajne podejście i nie zawiedzie, jeśli zmienna nie jest zdefiniowana.
podstawowy 6
10

Prawdopodobnie chcesz użyć „eq” zamiast „==”. Jeśli martwisz się niektórymi skrajnymi przypadkami, możesz również sprawdzić, czy nie ma niezdefiniowanych:

if (not defined $str) {

# this variable is undefined

}
DmitryK
źródło
1
Bardzo przydatne, gdy otrzymałeś ciąg poprzez przesunięcie tablicy, która może mieć 0 elementów.
Dacav
9

Jak już wspomniało kilka osób, eqjest to właściwy operator.

Jeśli jesteś use warnings;w swoim skrypcie, otrzymasz ostrzeżenia o tym (i wiele innych przydatnych rzeczy); Ja również polecam use strict;.

Matthew Slattery
źródło
+1 Super, tak, normalnie używam, use strictale aktualizuję stary kod, więc kiedy to dodam, otrzymuję setki błędów. Pewnie kiedyś je naprawię.
Nick Bolton,
4

Sama koncepcja „właściwego” sposobu robienia czegokolwiek, oprócz używania CPAN, nie istnieje w Perlu.

W każdym razie są to operatory numeryczne, których powinieneś używać

if($foo eq "")

lub

if(length($foo) == 0)
whatsisname
źródło
3
Prawdą jest, że Perl nie popiera „jedynej prawdziwej drogi” rozwiązywania problemów, ale to nie znaczy, że nie ma preferowanych idiomów, stylów i podejść. Ponadto, jak jeden ze stałych bywalców Perla lubi dużo mówić, nawet jeśli istnieje więcej niż jeden sposób robienia rzeczy, niektóre sposoby są naprawdę, bardzo złe (głupie, nierozsądne, trudne w utrzymaniu itp. .)
Telemachus
2
Tylko dlatego, że jest na to wiele sposobów, nie oznacza, że ​​wszystkie są równe. Testowanie na pustych strunach stosując if ($foo == ""), na przykład, jest ostatecznie źle chyba rzeczywiście znaczy być testowanie na czy $foo, oceniana w kontekście numerycznym, ma wartość 0 (w takim przypadku byłoby jeszcze lepiej napisany jako if ($foo == 0), jako że jaśniej wyraża swoje zamiar).
Dave Sherohman,
0

Aby sprawdzić, czy nie ma pustego ciągu, możesz również zrobić coś w następujący sposób

if (!defined $val || $val eq '')
{
    # empty
}
Roland Ayala
źródło