Best way to avoid “isn't numeric in numeric eq

2019-04-08 00:18发布

#!/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!";
} 

What is the best way, to avoid the 'Argument "f" isn't numeric in numeric eq (==) at ./perl.pl line 7.'-warning?
I suppose in this case I could use "eq" two times, but that doesn't look good.

4条回答
做个烂人
2楼-- · 2019-04-08 00:20

Not sure why you want to avoid the warning. The warning is telling you that there's a potential problem in your program.

If you're going to compare a number with a string that contains unknown data, then you're either going to have to use 'eq' for the comparison or clean up the data in some way so that you know it looks like a number.

查看更多
▲ chillily
3楼-- · 2019-04-08 00:26

The obvious way to avoid a warning about comparing a non-numeric to a numeric is not to do it! Warnings are there for your benefit - they should not be ignored, or worked around.

To answer what is the best way you need to provide more context - i.e. what does $c represent, and why is it necessary to compare it do 'd' or 9 (and why not use $c eq '9')?

查看更多
Bombasti
4楼-- · 2019-04-08 00:32
use Scalar::Util 'looks_like_number';    

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

You could also disable this category of warnings temporarily:

{
    no warnings 'numeric';
    # your code
}
查看更多
男人必须洒脱
5楼-- · 2019-04-08 00:35

Using a regular expression to see if that is a number:

if(($num=~/\d/) && ($num >= 0) && ($num < 10))
{
    # to do thing number 
}
查看更多
登录 后发表回答