我有一个小问题。我正在阅读一些代码,因为我的学校没有教我任何关于perl编程的有用信息,我在这里问你们。我看到这行在一些perl程序中被大量使用:
$variable = &something();
我不知道&
符号在这里是什么意思,因为我从未在perl中说过它。 something
是一个子程序(我猜)。它通常会说出一个名称,它有时也会像函数一样包含参数。有人可以告诉我&
代表什么,以及something
始终是什么。
变量接受某种返回值,然后用于检查某些条件,这使我认为它是一个子例程。但仍然为&
?
由于
答案 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
运算符