Perl使用特殊字符&

ban*_*ban 8 perl

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

$variable = &something();
Run Code Online (Sandbox Code Playgroud)

我不知道&这里的标志是什么意思,因为我从未在perl中说过.这something是一个子程序(我猜).它通常会说出一个名称,它有时也会像函数一样包含参数.有人能告诉我&这里代表什么,这something是什么时候.

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

谢谢

ike*_*ami 29

几乎每一次你看到&的外面\&fooEXRP && EXPR,这是一个错误.


  • &foo(...)是的,foo(...)除了foo's原型将被忽略.

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

    只调用子程序(不是运算符)&foo(...).

    sub print { ... }
    print(...);         # Calls the print builtin
    &print(...);        # Calls the print sub.
    
    Run Code Online (Sandbox Code Playgroud)

    您可能永远不需要在整个编程生涯中使用此功能.如果你看到它被使用,那肯定是有人&在他们不应该使用的时候.

  • &foo类似于&foo(@_).不同之处在于对@_in的更改foo会影响当前的sub @_.

    您可能永远不需要在整个编程生涯中使用此功能.如果你看到它被使用,肯定是有人&在他们不应该使用或愚蠢的优化尝试.但是,以下是非常优雅的:

    sub log_info  { unshift @_, 'info';  &log }
    sub log_warn  { unshift @_, 'warn';  &log }
    sub log_error { unshift @_, 'error'; &log }
    
    Run Code Online (Sandbox Code Playgroud)
  • 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()?
    
    Run Code Online (Sandbox Code Playgroud)
  • $&包含最后一个正则表达式匹配的匹配项.在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
    
    Run Code Online (Sandbox Code Playgroud)
  • 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;
    
    Run Code Online (Sandbox Code Playgroud)
  • &{ EXPR }()(和&$ref())是通过引用的子程序调用.尽管我更喜欢$ref->()语法,但这是一个完全可以接受且有些常见的事情.下一个项目中的示例.

  • \&foo引用子程序foo.这是一个完全可以接受的,有些常见的事情.

    my %dispatch = (
       foo => \&foo,
       bar => \&bar,
    );
    
    my $handler = $dispatch{$cmd} or die;
    $handler->();
    # Same:  &{ $handler }();
    # Same:  &$handler();
    
    Run Code Online (Sandbox Code Playgroud)
  • EXPR && EXPR是布尔AND运算符.我相信你对这个非常普通的操作员很熟悉.

    if (0 <= $x && $x <= 100) { ... }
    
    Run Code Online (Sandbox Code Playgroud)


Сух*_*й27 14

在旧版本的perl &中用于调用子例程.现在这不是必需的,\&主要用于采用reference子程序,

my $sub_ref = \&subroutine;
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @ikegami - 来自.pl扩展名和代码中的'&foo()',我希望它是非常古老的代码而不是使用包,但做这样的事情:file.pl`sub foo {.. .} 1;`然后`require file.pl; FOO()` (2认同)