Как можно избежать предупреждений при проверке элемента в массиве на числовую эквивалентность нулю, даже если некоторые элементы являются символьными строками? - PullRequest
3 голосов
/ 20 мая 2019

Я не хотел бы получать предупреждение о том, что проверяемое значение не является числовым в числовом выражении (==) при проверке нулевого числа в массиве массивов, который включает элементы символьных строк и числовые элементы.

Я работаю с массивом массивов (aoa) в Perl.Некоторые элементы в aoa являются символьными строками, а некоторые числовыми.Мне нужно проверить, является ли элемент $ aoa [$ i] [$ j] нулевым числом.Я использую этот код.

if($aoa[$i][$j] == '0'){
    next;
}

Это выдает тонны предупреждений (по одному на каждую проверку элемента символа - мои данные должны проверить несколько сотен тысяч элементов), что «аргумент не числовой в числовом выражении (==)».
Я хочу не видеть эти предупреждения.Кроме того, чтобы специально исключить это предупреждение на этом этапе в моем коде, могу ли я выполнить проверку каким-либо другим способом, чтобы он не выдавал эти предупреждения на этом этапе?

Это не так много, чтобы заставить мой код работать лучше для моей задачи, это просто перестать получать массу предупреждений, которые заставляют вас думать, что что-то не работает правильно в коде.Когда вы говорите кому-то: «О, не беспокойтесь обо всех этих предупреждениях - все работает нормально», некоторые люди склонны не верить вам!

Ответы [ 2 ]

6 голосов
/ 20 мая 2019

Вы можете использовать looks_like_number() (из Scalar :: Util ):

use Scalar::Util 'looks_like_number';

if (looks_like_number($aoa[$i][$j]) and $aoa[$i][$j] == '0'){
    next;
}

Или как то так:

# If the value has a length and is false, then it
# must be 0 or 0.0.
if (length($aoa[$i][$j]) and ! $aoa[$i][$j]) {
    next;
}
3 голосов
/ 20 мая 2019

Как всегда, есть несколько способов сделать это.Если ни один из ваших элементов не равен undef, то вы можете проверить на ложность и ne '', как в if (!$x && $x ne '') {} (для краткости используйте $ x).Это не поймает определенные выражения нуля, такие как «0E0» или «0, но истина».Если это важно для вас, тогда другой подход - использовать функцию looks_like_number() из стандартного модуля Scalar::Util.Таким образом, вы можете сказать if (looks_like_number($x) && $x == 0) {}, не боясь предупреждений.Вы также можете просто сказать if ($x eq '0') {}, если вы уверены, что ваши нули находятся в нормальной форме, потому что можно сравнивать строки с числом (но не наоборот).

Хорошо, если вы хотитеУстранить предупреждения, кстати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...