我有一个小问题.我正在阅读一些代码,因为我的学校没有教我任何关于perl编程的有用信息,我在这里问你们.我看到这条线在一些perl程序中被大量使用:
$variable = &something();
Run Code Online (Sandbox Code Playgroud)
我不知道&这里的标志是什么意思,因为我从未在perl中说过.这something是一个子程序(我猜).它通常会说出一个名称,它有时也会像函数一样包含参数.有人能告诉我&这里代表什么,这something是什么时候.
变量接受某种返回值,然后用于检查某些条件,这使我认为它是一个子例程.但还是为什么&呢?
谢谢
ike*_*ami 29
几乎每一次你看到&的外面\&foo和EXRP && 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