Лучший способ избежать "не является числовым в числовом выражении (==)" - предупреждение - PullRequest
6 голосов
/ 09 ноября 2010
#!/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", который не является числовым в числовом выражении (==) в строке ./perl.pl 7. '- предупреждение?
Я полагаю, что в этом случае я мог бы использовать «eq» два раза, но это выглядит не очень хорошо.

Ответы [ 4 ]

24 голосов
/ 09 ноября 2010
use Scalar::Util 'looks_like_number';    

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

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

{
    no warnings 'numeric';
    # your code
}
17 голосов
/ 09 ноября 2010

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

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

4 голосов
/ 09 ноября 2010

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

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

0 голосов
/ 24 июля 2011

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

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