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


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

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

I to samo z operatorem nie równym ...

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

Wydaje się, że to działa (myślę), ale nie jestem pewien, czy to jest poprawna metoda, czy też są jakieś nieprzewidziane wady. Coś po prostu nie pasuje do tego.


76
2018-01-11 23:16


pochodzenie




Odpowiedzi:


Aby porównać łańcuchy w Perlu, użyj eq lub ne:

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

The == i != operatorzy są numeryczne operatory porównania. Będą próbowali przekonwertować oba operandy na liczby całkowite przed ich porównywaniem.

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


111
2018-01-11 23:20



Tak, używając tego, ale musisz być ostrożny, że jeśli jest to undef i jeśli używasz ostrzeżeń, otrzymasz ostrzeżenie o uruchomieniu. Wiele sposobów obejścia ostrzeżenia. - Evan Carroll


  1. Ze względu na sposób przechowywania łańcuchów w Perlu, optymalizacja długości łańcucha.
    if (length $str) to dobry sposób sprawdzenia, czy ciąg znaków nie jest pusty.

  2. Jeśli znajdujesz się w sytuacji, w której jeszcze się nie chroniłeś undef, a następnie catch-all dla "non-empty", który nie ostrzeże if (defined $str and length $str).


84
2018-01-11 23:57



Myślę, że długość jest najbliższym testem, który mamy do wyrażenia idei, że nie ma nic w łańcuchu. - brian d foy
Wstrzymano, ponieważ if (length($str)) jest ładnym podejściem i nie zawiedzie, jeśli zmienna nie jest zdefiniowana. - basic6


Jak już wspomniano przez kilka osób, eq jest właściwym operatorem tutaj.

Jeśli ty use warnings; w twoim skrypcie otrzymasz ostrzeżenia o tym (i wiele innych przydatnych rzeczy); Polecam use strict; także.


9
2018-01-11 23:27



+1 Cool, tak, zwykle używam use strict ale aktualizuję jakiś stary kod, więc kiedy dodam to, otrzymuję setki błędów. Pewnie naprawię je pewnego dnia. - Nick Bolton


Prawdopodobnie chcesz użyć "eq" zamiast "==". Jeśli martwisz się niektórymi przypadkami krańcowymi, możesz również sprawdzić pod kątem niezdefiniowanych:

if (not defined $str) {

# this variable is undefined

}

9
2018-01-11 23:23



Bardzo przydatne, gdy otrzymałeś ciąg, przesuwając tablicę, która może zawierać 0 elementów. - Dacav


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

W każdym razie są to operatory liczbowe, powinieneś użyć

if($foo eq "")

lub

if(length($foo) == 0)

2
2018-01-11 23:20



To prawda, że ​​Perl nie opowiada się za "jedynym prawdziwym sposobem" na rozwiązywanie problemów, ale to nie znaczy, że nie ma zdecydowanie preferowanych idiomów i stylów i podejść. Ponadto, jako że jeden z stałych bywalców Perla lubi dużo mówić, nawet jeśli istnieje więcej niż jeden sposób robienia rzeczy, trochę sposoby robienia rzeczy są naprawdę, naprawdę złe (głupie, nierozważne, trudne do utrzymania, itp.) - Telemachus
To, że istnieje wiele sposobów, nie oznacza, że ​​wszystkie drogi są równe. Testowanie pustych ciągów za pomocą if ($foo == "")na przykład jest ostatecznie źle chyba że masz zamiar testować, czy $foo, ocenione w kontekście numerycznym, ma wartość 0 (w takim przypadku byłaby nadalbyć lepiej napisane jako if ($foo == 0), ponieważ wyraźniej wyraża twoje zamiary). - Dave Sherohman


Aby sprawdzić pusty ciąg znaków, możesz również wykonać następujące czynności

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

0
2017-11-06 04:19