Perl使用特殊字符&

时间:2013-06-18 16:06:59

标签: perl

我有一个小问题。我正在阅读一些代码,因为我的学校没有教我任何关于perl编程的有用信息,我在这里问你们。我看到这行在一些perl程序中被大量使用:

$variable = &something();

我不知道&符号在这里是什么意思,因为我从未在perl中说过它。 something是一个子程序(我猜)。它通常会说出一个名称,它有时也会像函数一样包含参数。有人可以告诉我&代表什么,以及something始终是什么。

变量接受某种返回值,然后用于检查某些条件,这使我认为它是一个子例程。但仍然为&

的原因

由于

2 个答案:

答案 0 :(得分:28)

实际上,每当您在&\&foo之外看到EXRP && EXPR时,都会出错。


  • &foo(...)foo(...)相同,但foo的原型将被忽略。

    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.
    

    您可能永远不需要在整个编程生涯中使用此功能。如果您看到它被使用,肯定会有人使用&,而不应该使用。{/ p>

  • &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是按位AND运算符。在处理在单个单词中存储多条信息的低级系统时使用此方法。

    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是布尔AND运算符。我相信你对这个非常普通的操作员很熟悉。

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

答案 1 :(得分:14)

在旧版本的perl &中用于调用子例程。现在这不是必需的,\&主要用于将reference带到子例程,

my $sub_ref = \&subroutine;

或忽略函数原型(http://perldoc.perl.org/perlsub.html#Prototypes

除引用子例程&之外,还有bitwise and运算符

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