В модуле Perl Вы иногда хотите создать подпрограммы или закрытия на лету. Вещь, это, как только Вы создали подпрограмму, как пройти она. Вы могли просто назвать его, но тогда если подпрограмма использует caller()
, это не будет столь полезно, как это могло быть. Это - то, где goto &subroutine
изменение может быть полезным.
sub AUTOLOAD{
my($self) = @_;
my $name = $AUTOLOAD;
$name =~ s/.*:://;
*{$name} = my($sub) = sub{
# the body of the closure
}
goto $sub;
# nothing after the goto will ever be executed.
}
можно также использовать эту форму goto
для обеспечения элементарной формы оптимизации последнего вызова.
sub factorial($){
my($n,$tally) = (@_,1);
return $tally if $n <= 1;
$tally *= $n--;
@_ = ($n,$tally);
goto &factorial;
}
(В [1 119] версия 16 Perl 5, которая была бы лучше записана как [1 120] goto __SUB__;
)
существует модуль, который импортирует tail
модификатор и тот, который импортирует recur
, если Вам не нравится использовать эту форму [1 123] goto
.
use Sub::Call::Tail;
sub AUTOLOAD {
...
tail &$sub( @_ );
}
use Sub::Call::Recur;
sub factorial($){
my($n,$tally) = (@_,1);
return $tally if $n <= 1;
recur( $n-1, $tally * $n );
}
goto
лучше сделано с другими ключевыми словами. Как [1 124] redo
луг немного кода:
LABEL: ;
...
goto LABEL if $x;
{
...
redo if $x;
}
Или идущий в last
из небольшого количества кода от нескольких мест:
goto LABEL if $x;
...
goto LABEL if $y;
...
LABEL: ;
{
last if $x;
...
last if $y
...
}
Взгляните на Count (*) vs Count (col) на www.mysqlperformanceblog.com, они обсуждают эту тему для различных типов 'col' (NOT NULL или нет, с индексом и т.д.) и это для таблиц MyISAM и InnoDB.
Я знаю, что вопрос касается MySQL, но, что бы он ни стоил, для Oracle рекомендуется count (*): это показывает, что это специфично для базы данных (см. Комментарий BalusC выше). Поскольку во многих базах данных (MS-SQL, MySQL) есть таблицы информационных схем, которые содержат различные типы метаданных, неизбежны различия, если один синтаксис просто ищет легко доступное значение, а другой идет прямо к таблице. . В конце концов: попробуйте разные варианты, посмотрите, что EXPLAIN говорит вам, что происходит за кулисами.