0

私はこのコードを持っていますが、警告が表示されます: Argument "" isn't numeric in numeric eq (==)for$id == $_

@delete には Web フォーム (CGI リクエスト) からの数値が含まれており、おそらくそれが perl がそれらの数値を文字列として扱っている理由です。正常に動作していますが、警告についてどうすればよいかわかりません。

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

私は警告を望んでいません。私の最良の選択肢は何ですか?

私は最初、配列を反復処理してすべての要素を呼び出すことを考えましたが、その考えは気に入りintませんでした。

4

3 に答える 3

3

0 が有効な ID でない場合は、次のような grep 構文を使用します。

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

または、 $_ が数字のみの場合に一致:

grep { /\d+/ and ($id == $_) } @delete;
于 2013-07-29T08:25:41.250 に答える
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"1 つには、空の文字列をゼロに変換することはありませんが、文字列を数値に変換することもありません12

空の文字列の問題は残りますが、空の文字列のキーがない限り問題ありません。

また、それらが「警告」と呼ばれる理由にも注意してください。それらは、あなたが何か正しくないことをしていることを示しています。したがって、理由を知らずに単に警告を黙らせることは非常に悪いことです。この場合、空の文字列値で何をしたいのかを具体的に把握する必要があります。(およびその他の考えられる悪い値)。

次のようにして、配列から空の文字列値を削除できます。

@delete = grep !/^$/, @delete;
于 2013-07-29T08:41:23.147 に答える
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) }

数値についてのみ入力を検証する必要があります。

于 2013-07-29T08:49:33.620 に答える