避免“is not numeric in numeric eq (==)”的最佳方法 - 警告

问题描述 投票:0回答: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!"; }

避免出现“Argument "f" isn't numeric in numeric eq (==) at ./perl.pl line 7.”警告的最佳方法是什么?

我想在这种情况下我可以使用“eq”两次,但这看起来不太好。

perl operators warnings equality
5个回答
27
投票
use Scalar::Util 'looks_like_number'; if ( $c eq 'd' || ( looks_like_number($c) && $c == 9 ) ) { say "Hello, world!"; }

您也可以暂时禁用此类警告:

{ no warnings 'numeric'; # your code }
    

19
投票
不确定为什么要避免警告。该警告告诉您程序中存在潜在问题。

如果您要将数字与包含未知数据的字符串进行比较,那么您要么必须使用“eq”进行比较,要么以某种方式清理数据,以便您知道它看起来像数量。


4
投票
避免出现有关将非数字与数字进行比较的警告的明显方法是

不这样做! 警告是为了您的利益而存在的 - 它们不应被忽视或解决。

要回答什么是

最好方式,您需要提供更多上下文 - 即$c

代表什么,以及为什么有必要比较它
'd'
9
(以及为什么不使用
$c eq '9'
) ?


0
投票
使用正则表达式查看是否是数字:

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

0
投票
在您的示例中,您可以使用...

if ( $c eq 'd' || $c eq '9' ) {
我需要知道...

if ( "08:30:22" > 10 ) {
我用过

if ( unpack('a2',$time) > 10 ) {
或者你可以将字符转换为ascii...

if ( ord($c) == 100 or orc($c) == 59 ) {
    
© www.soinside.com 2019 - 2024. All rights reserved.