2014-02-14 4 views
0

Предположим, что:If-оператор сокращения Condtion

... 
use Config::Properties::Simple; 
... 
my $p = Config::Properties::Simple->new(file => $propfile); 
... 
$str = $p->getProperty('prop'); 
... 

.

ли

... 
if (defined $str and $str ne "") { #1 
... 

равна

... 
if ($str) { #2 
... 

?

Если нет, есть ли способ упростить #1 сообщение с пометкой?

+0

'если (($ ул // ' ') ne' ') {...} ' –

+0

Да, они равны. И как вы могли упростить №2? – Axeman

+1

Это логически неверно, если не определено «,» и 0. Существует интересный частный случай 0E0, ноль в экспоненциальном обозначении, что является логическим истинным. – ddoxey

ответ

4

Нет, они не то же самое, если $str является "0".

Вы можете упростить заявление просто проверить длину:

if (length $str) { ... 

В последних версиях Perl, length(undef) является undef без какого-либо предупреждения генерироваться. И использование undef в качестве булева не генерирует предупреждения.

(Под «недавнее» Я имею в виду 5.12 and up. Раньше length(undef) будет производить «Использование неинициализированного значения длины», если вы предупреждения включены, которые вы должны.)

3
  1. Нет, это разные для $str=0; и $str="0"; для начинающих.

  2. Возможно. Зависит от того, какие значения могут иметь значения $str, что вы проверяете и какую версию Perl вы хотите поддерживать. Возможности:

    • if ($str)
    • if (length($str))
    • if (defined($str))
Смежные вопросы