Вызовы метода Perl могут быть прерваны?

Это вследствие того, что, когда SQL Server индексирует таблицу с данными, это в состоянии произвести точную статистику значений в индексированном столбце. В несколько моментов SQL Server повторно вычислит статистику, но когда Вы выполните крупные вставки, распределение значений может измениться после того, как статистика была вычислена в прошлый раз.

то, что статистика устарела, может быть обнаружено на Query Analyzer. Когда Вы видите, что на определенном количестве сканирования таблицы ожидаемых строк отличается к очень от фактических чисел обработанных строк.

необходимо использовать UPDATE STATISTICS для перевычисления распределения значений после вставки всех данных. После того, как то никакое различие в производительности не должно наблюдаться.

14
задан brian d foy 2 September 2009 в 00:56
поделиться

5 ответов

Да, вы можете перехватывать вызовы подпрограмм Perl. У меня есть целая глава об этом в Mastering Perl . Ознакомьтесь с модулем Hook :: LexWrap , который позволяет вам делать это, не вдаваясь в подробности. Методы Perl - это просто подпрограммы.

Вы также можете создать подкласс и переопределить метод, который хотите перехватить. Это немного лучший способ сделать это, потому что объектно-ориентированное программирование хочет, чтобы вы поступали именно так. Однако иногда люди пишут код, который не позволяет сделать это должным образом. Подробнее об этом также можно прочитать в Освоении Perl .

14
ответ дан 1 December 2019 в 07:39
поделиться

Вы можете, и Павел описывает хороший способ сделать это, но вам, вероятно, следует уточнить, почему вы хотите это сделать в первую очередь.

Если вы ищете продвинутые способы перехвата вызовов произвольных подпрограмм, тогда возня с таблицами символов будет работать для вас, но если вы хотите добавить функциональность к функциям, возможно, экспортированным в пространство имен, в котором вы в настоящее время работаете, тогда вам может потребоваться знать способы вызова функций, которые существуют в других пространствах имен.

Data :: Dumper, например, обычно экспортирует функцию 'Dumper' в вызывающее пространство имен, но вы можете переопределить или отключить это и предоставить свою собственную функцию Dumper, которая затем вызывает оригинал с помощью полного имени.

например,

use Data::Dumper;

sub Dumper {
   warn 'Dumping variables';
   print Data::Dumper::Dumper(@_);
}

my $foo = {
   bar   => 'barval',
};

Dumper($foo);

Опять же, это альтернативное решение, которое может быть более подходящим в зависимости от исходной проблемы. Играя с таблицей символов, можно получить много удовольствия, но это может оказаться излишним и может привести к трудностям в сопровождении кода, если он вам не нужен.

5
ответ дан 1 December 2019 в 07:39
поделиться

Вот полное пошаговое руководство по созданию функции поиска с автозаполнением .

По сути, у вас должен быть обработчик событий для вызова

window.location.href = "your-url-string.com";

после нажатия клавиши ввода или щелчка после выбора.

РЕДАКТИРОВАТЬ:

Из документации по автозаполнению

Замена страницы поиска

Для поиск по запросу и перенаправление на страница, связанная с результирующим элементом. Ниже приводится один из способов достижения

$::{"foo"} = sub { (@_)=($_[0], 1); goto $oldfoo; };
doit();

И теперь мы получаем:

3 / 1 = 3
3
ответ дан 1 December 2019 в 07:39
поделиться

Похоже, это работа для Moose ! Moose - это объектная система для Perl, которая может делать это и многое другое. docs объяснят гораздо лучше, чем я, но вам, вероятно, понадобится модификатор метода , в частности перед .

6
ответ дан 1 December 2019 в 07:39
поделиться

Вкратце, Perl обладает способностью изменять таблицу символов. Вы вызываете подпрограмму (метод) через таблицу символов пакета, которому принадлежит метод. Если вы измените таблицу символов (и это не считается очень грязным), вы можете заменить большинство вызовов методов вызовом других указанных вами методов. Это демонстрирует подход:

# The subroutine we'll interrupt calls to
sub call_me
{
    print shift,"\n";
}

# Intercepting factory
sub aspectate
{
    my $callee = shift;
    my $value = shift;
    return sub { $callee->($value + shift); };
}
my $aspectated_call_me = aspectate \&call_me, 100;

# Rewrite symbol table of main package (lasts to the end of the block).
# Replace "main" with the name of the package (class) you're intercepting
local *main::call_me = $aspectated_call_me;

# Voila!  Prints 105!
call_me(5);

Это также показывает, что, как только кто-то берет ссылку на подпрограмму и вызывает ее через ссылку, вы больше не можете влиять на такие вызовы.

Я почти уверен, что есть фреймворки для выполнения аспектирования в perl , но это, я надеюсь, демонстрирует подход.

7
ответ дан 1 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: