2014-11-13 6 views
1

У меня есть функция, которая проверяет правильность данных (то есть неотрицательно) и должна предупредить, а затем выйти из под. Проблема, с которой я сталкиваюсь, заключается в том, что предупреждение подавляется. Может ли кто-нибудь объяснить, почему предупреждение подавляется?Предупреждение не отправляется в stderr

#!/usr/bin/perl 
use strict; 
use warnings; 

my $a = b(); 
print "Function returned $a\n"; 

sub b 
{ 
    my $a = -1; 
    ($a >= 0) || (warn "\$a is negative" && return 0); 
    print "Passed negative check\n"; 
    return 1; 
} 

Выход, который я получать это

Function returned 0 
+5

Было бы слишком много, чтобы попросить использовать регулярный 'if' здесь? Просто потому, что вы можете написать это так в Perl, это не делает его хорошей идеей. – tadman

+2

Вы можете точно увидеть, что происходит, используя 'B :: Deparse':' perl -MO = Deparse -e 'sub foo {(-1> = 0) || (предупреждение «foo» && return 0)} foo'' выплевывает 'sub foo {warn return (0); } foo; ' – ThisSuitIsBlackNot

+4

Обратите внимание, что использование лексики' $ a' и '$ b' считается плохой формой, так как это может испортить' sort' и подобные функции. – ikegami

ответ

7

Внеочередные вопрос.

warn "\$a is negative" && return 0 

означает

warn("\$a is negative" && return 0) 

Вы хотите

warn "\$a is negative" and return 0 

или

warn("\$a is negative") && return 0 

еще лучше применять оба изменения.

warn("\$a is negative") and return 0 

Будьте осторожны с подводными камнями, когда вы опускаете парсеры вокруг списков аргументов.

Как правило, используют and и or если выражение РИТ состоит из выражения потока управления, такие как die, return, next, last, redo или exit.


На самом деле, почему вы проверить, какие warn возвращается? Вы на самом деле хотите

warn("\$a is negative"), return 0 

или

do { warn "\$a is negative"; return 0 } 

Таким образом мы получаем

$a >= 0 
    or warn("\$a is negative"), return 0; 

или

$a >= 0 
    or do { 
     warn "\$a is negative"; 
     return 0; 
    }; 

Но Я подозреваю, что большинство людей предпочли бы видеть

if ($a < 0) { 
    warn "\$a is negative"; 
    return 0; 
} 
+1

Жаль, что я мог бы дать второй пункт только для «На самом деле, почему вы проверяете, что« предупреждает »?» – tjd

Смежные вопросы