2010-05-20 1 views
5

Почему подпрограмма с try/catch дает мне те же результаты, что и eval-версия?Почему Perl's Try :: Tiny's try/catch дает мне те же результаты, что и eval?

#!/usr/bin/env perl 
use warnings; use strict; 
use 5.012; 
use Try::Tiny; 

sub shell_command_1 { 
    my $command = shift; 
    my $timeout_alarm = shift; 
    my @array; 
    eval { 
     local $SIG{ALRM} = sub { die "timeout '$command'\n" }; 
     alarm $timeout_alarm; 
     @array = qx($command); 
     alarm 0; 
    }; 
    die [email protected] if [email protected] && [email protected] ne "timeout '$command'\n"; 
    warn [email protected] if [email protected] && [email protected] eq "timeout '$command'\n"; 
    return @array; 
} 
shell_command_1('sleep 4', 3); 
say "Test_1"; 

sub shell_command_2 { 
    my $command = shift; 
    my $timeout_alarm = shift; 
    my @array; 
    try { 
     local $SIG{ALRM} = sub { die "timeout '$command'\n" }; 
     alarm $timeout_alarm; 
     @array = qx($command); 
     alarm 0; 
    } 
    catch { 
    die $_ if $_ ne "timeout '$command'\n"; 
    warn $_ if $_ eq "timeout '$command'\n"; 
    } 
    return @array; 
} 
shell_command_2('sleep 4', 3); 
say "Test_2" 
+0

Не забудьте включить результат, который вы получаете. –

ответ

12

Вам не хватает конечной точки с запятой в блоках try/catch.

У вас есть:

try { 
    ... 
} 
catch { 
    ... 
} 
return; 

Итак, у вас есть код, который эквивалентен: try(CODEREF, catch(CODEREF, return));

Update:

Я забыл упомянуть, чтобы исправить ваш код просто изменить shell_command_2:

sub shell_command_2 { 
    my $command = shift; 
    my $timeout_alarm = shift; 
    my @array; 
    try { 
     local $SIG{ALRM} = sub { die "timeout '$command'\n" }; 
     alarm $timeout_alarm; 
     @array = qx($command); 
     alarm 0; 
    } 
    catch { 
     die $_ if $_ ne "timeout '$command'\n"; 
     warn $_ if $_ eq "timeout '$command'\n"; 
    };   # <----- Added ; here <======= <======= <======= <======= 
    return @array; 
} 

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

  • Нет связанных вопросов^_^