Amazon Best VPN GoSearch

Значок OnWorks

perlpragma - Интернет в облаке

Запустите perlpragma в бесплатном хостинг-провайдере OnWorks через Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS

Это команда perlpragma, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


perlpragma - как написать прагму пользователя

ОПИСАНИЕ


Прагма - это модуль, который влияет на некоторые аспекты времени компиляции или выполнения.
поведение Perl, такое как «строгое» или «предупреждение». С Perl 5.10 вы больше не
ограничивается встроенной прагматой; теперь вы можете создавать пользовательские прагматы, которые изменяют
поведение пользовательских функций в пределах лексической области.

A основной пример


Например, скажем, вам нужно создать класс, реализующий перегруженный математический
операторы, и хотели бы предоставить вашу собственную прагму, которая работает так же, как "использовать
целое число; "Вы хотите, чтобы этот код

используйте MyMaths;

мой $ l = MyMaths-> новый (1.2);
мой $ r = MyMaths-> новый (3.4);

напечатайте "A:", $ l + $ r, "\ n";

используйте myint;
напечатайте "B:", $ l + $ r, "\ n";

{
нет миинта;
напечатайте "C:", $ l + $ r, "\ n";
}

напечатайте "D:", $ l + $ r, "\ n";

нет миинта;
напечатайте "E:", $ l + $ r, "\ n";

дать выход

A: 4.6
B: 4
C: 4.6
D: 4
E: 4.6

т.е., где "использовать myint;" действует, операции сложения переводятся в целое число, тогда как
по умолчанию это не так, а поведение по умолчанию восстанавливается через "no myint";

Минимальная реализация пакета MyMaths будет примерно такой:

пакет MyMaths;
использовать предупреждения;
использовать строго;
используйте myint ();
использовать перегрузку '+' => sub {
мой ($ l, $ r) = @_;
# Пройдите 1, чтобы проверить один уровень звонка отсюда
если (myint ::в результате(1)) {
int ($$ l) + int ($$ r);
} Еще {
$$ l + $$ r;
}
};

новый {
мой ($ класс, $ значение) = @_;
Благослови \ $ value, $ class;
}

1;

Обратите внимание, как мы загружаем прагму пользователя «myint» с пустым списком «()», чтобы предотвратить ее «импорт».
называется.

Взаимодействие с компиляцией Perl происходит внутри пакета myint:

пакет myint;

использовать строго;
использовать предупреждения;

дополнительный импорт {
$ ^ H {"myint / in_effect"} = 1;
}

суб неимпорт {
$ ^ H {"myint / in_effect"} = 0;
}

саб in_effect {
мой $ level = shift // 0;
мой $ hinthash = (вызывающий ($ уровень)) [10];
return $ hinthash -> {"myint / in_effect"};
}

1;

Поскольку прагматы реализованы в виде модулей, как и любой другой модуль, «используйте myint;» становится

НАЧАТЬ {
требуется myint;
myint-> import ();
}

и "без минта"; является

НАЧАТЬ {
требуется myint;
myint-> unimport ();
}

Следовательно, подпрограммы «импорт» и «неимпорт» вызываются в компилировать время для кода пользователя.

Пользовательские прагматы сохраняют свое состояние, записывая в магический хеш "% ^ H", поэтому эти два
процедуры манипулируют этим. Информация о состоянии в "% ^ H" хранится в optree и может быть
извлекается только для чтения во время выполнения с помощью "caller ()" по индексу 10 списка возвращенных
полученные результаты. В примере прагмы извлечение инкапсулируется в подпрограмму in_effect (),
который принимает в качестве параметра количество кадров вызовов, которые нужно поднять, чтобы найти значение
прагма в скрипте пользователя. Это использует "caller ()" для определения значения
$ ^ H {"myint / in_effect"} при вызове каждой строки пользовательского скрипта, и, следовательно,
обеспечить правильную семантику в подпрограмме, реализующей перегруженное добавление.

Основные именования


Есть только один "% ^ H", но произвольно много модулей, которые хотят использовать его область видимости.
семантика. Чтобы не наступать друг другу на пальцы, им нужно обязательно использовать разные
ключи в хеше. Поэтому обычно в модуле используются только те ключи, которые начинаются
с именем модуля (именем его основного пакета) и символом «/». После этого
префикс, идентифицирующий модуль, остальная часть ключа полностью зависит от модуля: он может
включать любые символы вообще. Например, модуль «Foo :: Bar» должен использовать такие ключи
как «Foo :: Bar / baz» и «Foo :: Bar / $% / _!». Все модули, следующие этому соглашению, хорошо работают
друг с другом.

Ядро Perl использует несколько ключей в "% ^ H", которые не соответствуют этому соглашению, потому что
они предшествуют этому. Ключи, соответствующие соглашению, не будут конфликтовать с ключами ядра.
исторические ключи.

Реализация детали


Optree разделяется между потоками. Это означает, что существует вероятность того, что optree
переживет конкретный поток (и, следовательно, экземпляр интерпретатора), который создал
это, поэтому истинные скаляры Perl не могут храниться в optree. Вместо этого используется компактная форма,
который может хранить только целые числа (подписанные и беззнаковые), строки или "undef" -
ссылки и значения с плавающей запятой преобразованы в строки. Если вам нужно хранить несколько
значения или сложные структуры, вы должны сериализовать их, например, с помощью "pack". В
удаление хеш-ключа из "% ^ H" записывается и, как всегда, его можно отличить от
наличие ключа со значением «undef» с «существует».

не попытаться сохранить ссылки на структуры данных как целые числа, которые извлекаются через
"вызывающий" и преобразованный обратно, так как это не будет потокобезопасным. Доступ будет к
структура без блокировки (что небезопасно для скаляров Perl), и либо структура
должен течь, или он должен быть освобожден, когда его создающий поток завершается, что может быть
до ссылки на optree удаляется, если другие потоки переживут его.

Используйте perlpragma онлайн с помощью сервисов onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

Команды Linux

Ad




×
Реклама
❤️Совершайте покупки, бронируйте или заказывайте здесь — никаких затрат, что помогает поддерживать бесплатность услуг.