2010-11-09 10 views
5
#!/usr/bin/env perl 
use warnings; 
use 5.12.2; 

my $c = 'f'; # could be a number too 

if ($c eq 'd' || $c == 9) { 
    say "Hello, world!"; 
} 

Jaki jest najlepszy sposób, aby uniknąć "Argument" f "nie jest numeryczne w równaniu numerycznym (==) na ./perl.pl wiersz 7 .'- ostrzeżenie?
Przypuszczam, że w tym przypadku mógłbym użyć "eq" dwa razy, ale to nie wygląda dobrze.Najlepszym sposobem, aby uniknąć "nie jest numeryczny w eq (==)" - ostrzeżenie

+0

użyję "EQ". –

Odpowiedz

16

Nie wiem, dlaczego chcesz uniknąć ostrzeżenia. Ostrzeżenie pokazuje, że istnieje potencjalny problem w twoim programie.

Jeśli chcesz porównać liczbę z ciągiem zawierającym nieznane dane, musisz użyć "eq" do porównania lub wyczyścić dane w pewien sposób, abyś wiedział, że wygląda jak liczba.

+0

Masz rację co do zasady, ale pytanie brzmi: w jaki sposób wyłączyć komunikaty. Różnicowanie Perls między porównaniami łańcuchów i liczb jest w najlepszym wypadku denerwujące. Nie ma to znaczenia, jeśli porównanie odbywa się za pomocą "==" lub "eq", więc można równie dobrze wyłączyć ostrzeżenie. W moich oczach odpowiedź Eugene Y jest tą, która się liczy na to pytanie. –

+0

Biorąc pod uwagę, że nie ma znaczenia, czy porównanie odbywa się za pomocą == lub eq, właściwym sposobem jest użycie operatora porównywania ciągów w celu porównania ciągów. Wyłączenie ostrzeżenia to stosunkowo więcej pracy niż po prostu skorzystanie z właściwego operatora; nie wspominając o tym, że cała podstawa pytania to pobieżna opinia, że ​​"eq" użyte dwukrotnie "nie wygląda dobrze". '$ c' jest ciągiem znaków i nie ma tu matematyki. Traktuj to jak sznur, na litość boską, i po prostu zacytuj dziewięć. :) – dannysauer

4

Oczywistym sposobem na uniknięcie ostrzeżenia o porównywaniu nieliczbowego z numerycznym jest aby tego nie robić! Ostrzeżenia są dostępne dla twojej korzyści - nie należy ich ignorować ani pracować.

Aby odpowiedzieć na to, co jest najlepiej sposób trzeba dostarczyć więcej kontekstu - czyli co ma $c reprezentowania i dlaczego jest to konieczne, aby porównać to zrobić 'd' lub 9 (i dlaczego nie użyć $c eq '9')?

+0

Bo co, jeśli $ c eq "9" lub "9.0" lub "009"? Najlepiej używać Scalar :: Util "looks_like_number"; jak stwierdzono w eugenie. –

+0

to właśnie poprosiłem go o wyjaśnienie! – Alnitak

23
use Scalar::Util 'looks_like_number';  

if ($c eq 'd' || (looks_like_number($c) && $c == 9)) { 
    say "Hello, world!"; 
} 

Można również wyłączyć tę kategorię ostrzeżenia tymczasowo:

{ 
    no warnings 'numeric'; 
    # your code 
} 
+0

działa dobrze. Dzięki! Ponieważ muszę używać XMPP do debugowania, stałe ostrzeżenia są bardzo dobrym powodem do wyłączenia tego rodzaju na dobre. –

0

Korzystanie z wyrażeń regularnych, aby sprawdzić, czy to jest numer:

if(($num=~/\d/) && ($num >= 0) && ($num < 10)) 
{ 
    # to do thing number 
} 
Powiązane problemy