参数“”在数字eq(==)中不是数字

时间:2013-07-29 08:22:53

标签: perl

我有这段代码,我收到警告:Argument "" isn't numeric in numeric eq (==) $id == $_

@delete的数字来自网络表单(CGI请求),这可能就是为什么perl将这些数字视为字符串。它工作正常,但我不知道如何处理这些警告。

my @IDs =  (21, 36, 6, 7, 64, 6435, 24);
for my $id (@IDs) {
    push @insert, $id if (grep $id == $_, @delete)
}

我不想要警告。什么是我最好的选择?

我首先考虑迭代数组并为每个元素调用int,但我并不喜欢这个想法。

3 个答案:

答案 0 :(得分:3)

如果0不是有效ID,请使用如下grep语法:

grep { $_ and ($id == $_) } @delete;

或者,如果$ _只有数字,则匹配:

grep { /\d+/ and ($id == $_) } @delete;

答案 1 :(得分:2)

  

...这就是为什么perl将这些数字视为字符串

不,由于数字相等运算符==,Perl会将您的数据转换为数字。当它警告""时,表示您有一个空字符串,它将被转换为零0。换句话说,您的@delete数组包含一个空元素。

你可能应该做的是使用哈希:

my @IDs = (21, 36, 6, 7, 64, 6435, 24);
my %ID  = map { $_ => 1 } @IDs;
my @insert = grep $ID{$_}, @delete;

这将避免任何转换,这既可以是好事也可以是坏事。首先,它不会将空字符串转换为零,但它也不会将字符串" 12"转换为数字12

您的空字符串问题仍将存在,但只要您没有空字符串的键,就可以了。

另外,你应该记住为什么它们被称为“警告”。他们在那里表明你正在做一些不太正确的事情。因此,仅仅在不知道为什么是非常坏的事情的情况下消除警告。在这种情况下,您应该具体指出要对空字符串值执行的操作。 (以及其他可能的不良价值)。

您可以通过执行以下操作从数组中删除空字符串值:

@delete = grep !/^$/, @delete;

答案 2 :(得分:2)

问题的快速演示:

use strict;
use warnings;

my @insert;
my @IDs =  (21, 36, 6, 7, 64, 6435, 24);

my @delete = split / /, "1 2 4";
warn "this is ok";
for my $id (@IDs) { push @insert, $id if (grep { $id == $_ } @delete) }

warn "now get warning";
@delete = split / /, "1 2  4";
#                        ^^ note two spaces - the split will produce one empty element
for my $id (@IDs) { push @insert, $id if (grep { $id == $_ } @delete) }

您只需要为数字验证输入。