2013-06-18 4 views
8

У меня был небольшой вопрос. Я читал какой-то код, и, поскольку моя школа не учила мне ничего полезного в программировании на Perl, я здесь, чтобы спросить вас, люди. Я вижу, эта линия используется много в некоторых программах на языке Perl:Perl используя специальный символ &

$variable = &something(); 

Я не знаю, что & знак означает, что здесь, как я никогда не говорю это в Perl. И something является подпрограммой (я угадываю). Обычно он говорит имя и иногда имеет аргументы, подобные функции. Может ли кто-нибудь сказать мне, что означает & и что то something все время.

Переменная принимает какое-то возвращаемое значение и затем используется для проверки некоторых условий, что заставляет меня думать, что это подпрограмма. Но почему же &?

Благодаря

ответ

14

В старых версиях Perl & используется для вызова подпрограмм. Теперь в этом нет необходимости и \& в основном используется, чтобы сделать reference к подпрограмме,

my $sub_ref = \&subroutine; 

или игнорировать прототип функции (http://perldoc.perl.org/perlsub.html#Prototypes)

Другого, чем для ссылающихся подпрограмм & является bitwise and оператора,

http://perldoc.perl.org/perlop.html#Bitwise-And

+0

Ах так, если я изменить его без знака и он будет по-прежнему работать? – ban

+1

Да, он все равно будет работать. –

+0

в порядке. Поэтому я не могу найти функцию, на которую она указывает. Это должно быть в каком-то другом файле. Но можете ли вы сказать мне, как они вызвали функцию из другого файла без использования пакета: package :: sub() – ban

27

Практически каждый раз, когда вы видите & вне \&foo и EXRP && EXPR, это ошибка.


  • &foo(...) такая же, как foo(...) кроме прототипа foo «s будет игнорироваться.

    sub foo(&@) { ... }  # Cause foo to takes a BLOCK as its first arg 
    
    foo { ... } ...; 
    &foo(sub { ... }, ...); # Same thing. 
    

    только подпрограммы (не операторы) будут вызываться &foo(...).

    sub print { ... } 
    print(...);   # Calls the print builtin 
    &print(...);  # Calls the print sub. 
    

    Вам, вероятно, никогда не понадобится использовать эту функцию во всей карьере программирования. Если вы видите, что это используется, то, конечно, кто-то использует &, когда они этого не делают.

  • &foo похоже на &foo(@_). Разница заключается в том, что изменения в @_ в foo влияют на текущий вспомогательный @_.

    Вам, вероятно, никогда не понадобится использовать эту функцию во всей карьере программирования. Если вы видите, что это используется, то, конечно, кто-то использует &, если они не должны или глупые попытки оптимизации. Однако, следующие довольно элегантна:

    sub log_info { unshift @_, 'info'; &log } 
    sub log_warn { unshift @_, 'warn'; &log } 
    sub log_error { unshift @_, 'error'; &log } 
    
  • goto &foo похож на &foo, за исключением текущей подпрограммы удаляется из стека вызовов первым. Это приведет к тому, что он не будет отображаться в трассировке стека, например.

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

    sub log_info { unshift @_, 'info'; goto &log; } # These are slower than 
    sub log_warn { unshift @_, 'warn'; goto &log; } # not using goto, but maybe 
    sub log_error { unshift @_, 'error'; goto &log; } # maybe log uses caller()? 
    
  • $& содержит то, что последнее регулярное выражение матч выражения совпало. Прежде чем 5.20, использование этого приведет к тому, что каждое регулярное выражение во всем интерпретаторе станет медленнее (если у них нет захвата), поэтому не используйте это.

    print $&  if /fo+/;  # Bad before 5.20 
    print $MATCH if /fo+/;  # Bad (Same thing. Requires "use English;") 
    print ${^MATCH} if /fo+/p; # Ok (Requires Perl 5.10) 
    print $1  if /(fo+)/; # Ok 
    
  • defined &foo это совершенно законный способ проверки, если подпрограмма существует, но это не то, что вы, вероятно, когда-нибудь понадобится. Там также exists &foo похож, но не так полезен.

  • EXPR & EXPR - побитовый оператор И. Это используется при работе с низкоуровневыми системами, которые хранят несколько фрагментов информации одним словом.

    system($cmd); 
    die "Can't execute command: $!\n"  if $? == -1; 
    die "Child kill by ".($? & 0x7F)."\n" if $? & 0x7F; 
    die "Child exited with ".($? >> 8)."\n" if $? >> 8; 
    
  • &{ EXPR }()&$ref()) представляет собой вызов подпрограммы через ссылку. Это вполне приемлемая и довольно распространенная вещь, хотя я предпочитаю синтаксис $ref->(). Пример в следующем элементе.

  • \&foo ссылается на подпрограмму foo. Это вполне приемлемая и довольно распространенная вещь.

    my %dispatch = (
        foo => \&foo, 
        bar => \&bar, 
    ); 
    
    my $handler = $dispatch{$cmd} or die; 
    $handler->(); 
    # Same: &{ $handler }(); 
    # Same: &$handler(); 
    
  • EXPR && EXPR это логическое И оператор. Я уверен, что вы знакомы с этим чрезвычайно распространенным оператором.

    if (0 <= $x && $x <= 100) { ... } 
    
+0

Забыл о побитом и булевом И. Добавлен. – ikegami

+0

Огромное вам спасибо ... это было много информации в одном ответе – ban

+0

@ikegami ... не оставляйте нас! –

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