&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) { ... }
Ах так, если я изменить его без знака и он будет по-прежнему работать? – ban
Да, он все равно будет работать. –
в порядке. Поэтому я не могу найти функцию, на которую она указывает. Это должно быть в каком-то другом файле. Но можете ли вы сказать мне, как они вызвали функцию из другого файла без использования пакета: package :: sub() – ban