2010-11-09 2 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!"; 
} 

Каков наилучший способ избежать «аргумента» f »не является числовым в числовом eq (==) на ./perl.pl строка 7. '- предупреждение?
Я предполагаю, что в этом случае я мог бы использовать «eq» два раза, но это не выглядит хорошо.Лучший способ избежать «не является числовым в числовом экваторе (==)» - предупреждение

+0

Я буду использовать «эк». –

ответ

16

Не знаю, почему вы хотите, чтобы избежать предупреждения. Предупреждение говорит вам, что в вашей программе есть потенциальная проблема.

Если вы хотите сравнить число со строкой, содержащей неизвестные данные, то вам придется либо использовать «eq» для сравнения, либо очистить данные каким-либо образом, чтобы вы знали это выглядит как номер.

+0

Вы правы в принципе, однако вопрос в том, как отключить сообщения. Дифференциация Perls между строковыми и числовыми сравнениями в лучшем случае раздражает. Кажется, не имеет значения, если сравнение выполняется с помощью '==' или 'eq', чтобы можно было отключить это предупреждение. В моих глазах ответ Юджина Я - тот, который имеет значение для этого вопроса. – 2012-12-14 18:00:40

+0

Учитывая, что это не имеет значения, если сравнение выполняется через == или eq, правильным способом является использование оператора сравнения строк для сравнения строк. Отключение предупреждения - это сравнительно большая работа, чем просто использование правильного оператора для начала; не говоря уже о том, что вся основа вопроса заключается в отрывочном мнении, что «eq» используется дважды «не выглядит хорошо». '$ c' - это строка, и здесь нет математики. Так что, пожалуй, побалуйте его, как нить, и просто процитируйте девять. :) – dannysauer

4

Очевидным способом избежать предупреждения о сравнении нецифрового номера с цифровым является не для этого! Предупреждения существуют для вашей выгоды - их нельзя игнорировать или работать.

Чтобы ответить на то, что это лучший путь вам необходимо предоставить больше контекста - то есть то, что действительно представляет $c, и почему это нужно сравнить это сделать 'd' или 9 (и почему бы не использовать $c eq '9')?

+0

Потому что, если $ c eq "9" или "9.0" или "009"? Лучше всего использовать Scalar :: Util 'look_like_number'; как сказано выше. –

+0

вот что я попросил его уточнить! – Alnitak

23
use Scalar::Util 'looks_like_number';  

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

Вы также можете отключить эту категорию предупреждений временно:

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

работает нормально. Благодаря! Поскольку я должен использовать XMPP для отладки постоянных предупреждений, это очень хорошая причина, чтобы отключить этот вид навсегда. – 2011-09-27 07:47:02

0

Используя регулярное выражение, чтобы увидеть, если это число:

if(($num=~/\d/) && ($num >= 0) && ($num < 10)) 
{ 
    # to do thing number 
} 
Смежные вопросы