2011-01-06 4 views
0

Как и в #define (директива препроцессора) на C, существует ли способ определить блок кода в perl.Могу ли я определить блок кода в Perl?

use constant PI=>3.14; 

Нравится программа? Поделись с друзьями! Могу ли я сделать то же самое с блоком кода?

Следующая часть кода не работает. Как я могу достичь того же?

use constant FUN=>{ 
$i=3; 
while($i) 
{ 
    print "$i\n";--$i;} 
} 

ответ

0

Используйте ключевое слово sub, чтобы определить функцию. В отличие от предварительной обработки langage, почти бесполезно в языке сценариев, например perl.

+0

Ну, это не так, как препроцессор C в основном используется для определения встроенных функций ... плюс, даже почти все скомпилированные языки проходят вместе без препроцессора :) – delnan

+0

sub отлично, но я проверял, разрешен ли препроцессор, например C. – Joe

+0

для чего вам нужен препроцессор? представление ? – VGE

3

У Perl нет макросов. (Достаточно сумасшедший программист мог подделать их с использованием исходных фильтров, но лучше всего избегать такой черной магии.) use constant не вызывает встроенную замену, как это делает препроцессор C. Вместо этого он создает подпрограмму, которая всегда возвращает одно и то же значение. Когда вы пишете

use constant PI => 3.14; 

что делает Perl является (по существу)

sub PI() { 3.14 } 

constant прагма может использоваться только для определения значений, а не код. Чтобы повторно использовать код, определите подпрограмму.

+0

Perl имеет макросы; см. 'Devel :: Declare'. – jrockway

2

Большинство людей пишут, что (дать или взять позиционирование брекетов), как:

sub FUN 
{ 
    my $i = 3; 
    while ($i) 
    { 
     print "$i\n"; 
     --$i; 
    } 
} 

Вы можете сделать:

my $FUN = sub { print "$_\n" foreach (qw(3 2 1)); }; 
&$FUN(); 
+0

или '$ FUN ->();' (немного читаем?) – mfontani

-1

Try/улов в Perl может быть реализован следующим образом:

eval { 
    # do something 
    die "Exception1\n" if $something_not_right; 
}; 
if ([email protected]) { 
    for ([email protected]) { 
    /Exception1/ && do { handle_excp1(); last; }; 
    /Exception2/ && do { handle_excp2(); last; }; 
    die "Don't know how to handle [email protected]\n"; 
    }; 
}; 

Конечно, вам не нужно использовать строковый литерал для исключения. Любая ссылка на объект.

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