Викиучебник ruwikibooks https://ru.wikibooks.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 MediaWiki 1.47.0-wmf.20 first-letter Медиа Служебная Обсуждение Участник Обсуждение участника Викиучебник Обсуждение Викиучебника Файл Обсуждение файла MediaWiki Обсуждение MediaWiki Шаблон Обсуждение шаблона Справка Обсуждение справки Категория Обсуждение категории Полка Обсуждение полки Импортировано Обсуждение импортированного Рецепт Обсуждение рецепта Задача Обсуждение задачи TimedText TimedText talk Модуль Обсуждение модуля Event Event talk LaTeX/Установка LaTeX 0 19937 270048 270046 2026-09-21T17:10:41Z Def2010 48479 Отменена версия [[Special:Diff/270046|270046]], сделанная [[Special:Contributions/~2026-50804-59|~2026-50804-59]] ([[User talk:~2026-50804-59|обсуждение]]) - вандализм 270048 wikitext text/x-wiki {{Навигация учебника|Содержание = Да}} == Дистрибутивы == TeX и LaTeX доступны практически для всех платформ. Наиболее распространённым способом установки LaTeX является использование одного из дистрибутивов. Включённые в состав дистрибутива наборы программ и пакетов (компиляторы, макропакеты, шрифты и т. д.), как правило, не требуют дополнительной настройки. В состав дистрибутива входит утилита для управления установкой и обновлением пакетов. В состав перечисленных дистрибутивов включён простой редактор (например, TeXworks в случае TeX Live), но вы можете использовать любой редактор, добавив в него подсветку синтаксиса LaTeX, или использовать специализированный [[#Редакторы|редактор]]. Наиболее популярными дистрибутивами LaTeX являются: === TeX Live === [http://www.tug.org/texlive/ TeX Live] — наиболее полный дистрибутив TeX/LaTeX для *BSD, GNU/Linux, Mac OS X и Windows. TeX Live включён в состав некоторых дистрибутивов Linux, например, Debian и Ubuntu, и может быть установлен с использованием штатных средств управления пакетами в ОС. Недостатком подобной интеграции является фиксированная версия TeX Live в дистрибутиве ОС. Например, в состав Ubuntu 18.04 входит TeX Live 2017<ref>{{cite web |url=https://packages.ubuntu.com/search?keywords=texlive |title=Ubuntu packages |accessdate=2018-06-12 |lang=en}}</ref>, и в течение жизненного цикла данного релиза Ubuntu переход на TeX Live 2018 будет невозможен. Альтернативный способ — установка последней версии с сайта TeX Live. === MiKTeX === [https://miktex.org/ MiKTeX] — дистрибутив для Microsoft Windows. === MacTeX === [http://www.tug.org/mactex/ MacTeX] — дистрибутив для Mac OS. Основан на Tex Live, в состав включены дополнительные утилиты, редактор и менеджер библиографии. == Редакторы == Для редактирования исходных текстов TeX/LaTeX можно использовать любой текстовый редактор, но для удобства вам будет желательно иметь ряд дополнительных возможностей: подсветку синтаксиса, поддержку навигации по заголовкам, автодополнение и т. д. Таблица со сравнением характеристик различных редакторов LaTeX есть в [[w:Сравнение редакторов TeX|Википедии]]. === Универсальные === ==== Emacs ==== Emacs — универсальный расширяемый текстовый редактор. Опытные пользователи могут самостоятельно настроить его для работы с LaTeX, используя возможности встроенного языка Emacs Lisp. Для начинающих подойдут расширения [http://www.gnu.org/software/auctex/ AUCTeX] и [https://www.gnu.org/software/auctex/reftex.html Reftex]. ==== Vim ==== Vim наряду с Emacs также остаётся одним из самых популярных универсальных текстовых редакторов. Для работы с LaTeX существуют расширения [https://www.vim.org/scripts/script.php?script_id=3109 LaTeX Box] и [http://vim-latex.sourceforge.net/ Vim-LaTeX]. ==== Atom ==== [https://atom.io/ Atom] — современный кроссплатформенный текстовый редактор. Для поддержки LaTeX требуется установка пакета [https://atom.io/packages/language-latex Language-LaTeX]. === Специализированные === [[Файл:TeXworks.png|thumb|upright=1.5|Скриншот TeXworks в ОС Ubuntu 12.10.]] В состав TeX Live входит простой редактор TeXworks, обеспечивающий подстветку синтаксиса, компиляцию и предварительный просмотр PDF. ==== TeXmaker и TeXstudio ==== [[Файл:TeXstudio 2.12.6.png|thumb|upright=1.5|Скриншот TeXstudio.]] [http://texstudio.sourceforge.net/ TeXstudio] появился в 2009 году в качестве форка [http://www.xm1math.net/texmaker/ TeXmaker]. С тех пор эти два редактора развиваются параллельно и обладают схожим функционалом: * Подсветка синтаксиса. * Автодополнение команд. * Умная компиляция: если требуется повторная компиляция для обновления ссылок или оглавления, то редактор сделает это автоматически. * Свёртка элементов: разделов, формул и других окружений. * Проверка орфографии. Словарь русского языка не входит в комплект, предлагается установить словарь с сайта расширений для LibreOffice. * Навигация. Редактор распознаёт команды секций в документе и выводит панель навигации. * Управление ссылками и метками. При создании ссылки на метку или элемент библиографии редактор выводит список меток в документе. * Мастер создания и редактирования таблиц. ==== TeXnicCenter ==== [http://www.texniccenter.org TeXnicCenter] обеспечивает практически тот же функционал, что и TeXmaker/TeXstudio, но работает только под Windows и медленно развивается. ==== LyX ==== [[Файл:LyX15.png|thumb|upright=1.5|Скриншот LyX 2.1.x в ОС Windows.]] [https://www.lyx.org/ LyX] — визуальный редактор, использующий собственный язык разметки, который транслируется в LaTeX. В процессе редактирования пользователь работает с семантической структурой документа и видит лишь приблизительный вид итогового результата. Подобный подход получил название [[w:WYSIWYM|WYSIWYM]] (What You See Is What You Mean — «То, что ты видишь, есть то, что ты имеешь в виду») в отличие от [[WYSIWYG]]. == Примечания == <references/> {{LaTeX/Навигационная таблица}} [[en:LaTeX/Installation]] av0s2pz3o4bhicfww3lik8ouknnfxoj Некоторые сведения о Perl 5/Ссылки 0 30398 270047 269927 2026-09-21T14:47:36Z ScriptMaster 15708 /* Примеры использования ссылок */ 270047 wikitext text/x-wiki {{Навигация учебника}} Данные программы размещаются в оперативной памяти компьютера. Обычно мы обращаемся к значениям в памяти через переменные. Каждая переменная имеет свой адрес в памяти. ''Ссылка в Perl'' — это скалярная переменная, которая хранит адрес другой переменной в памяти. Основной областью применения ссылок является создание сложных структур, способных изменяться во время исполнения программы. В языках C и C++ существуют понятия ''указателя'' и ''ссылки'', которые в общем не тождественны друг другу, однако, в Perl это одно и то же. В этой главе мы рассмотрим как работать с ссылками в Perl и как ими пользоваться. == Виды ссылок == Ссылки в Perl появились с 5-й версии из-за необходимости создания структур произвольной сложности, которые невозможно определить через простые переменные, например многомерные массивы. Помимо создания сложных структур, ссылки активно используются для создания объектов ООП. В Perl можно создать ссылку на любые данные, таким образом, можно выделить следующие виды ссылок: * ссылка на скаляр; * ссылка на массив скаляров; * ссылка на хеш-массив; * ссылка на функцию; * ссылка на ссылку (так как ссылка по сути является скаляром, то на саму ссылку также можно создать ссылку); * typeglob ссылка. Ссылка в Perl хранит тип данных, на который она ссылается. Для получения типа ссылки используется функция <code>ref()</code>, аргументом которой должна быть ссылка. Эта функция возвращает пустую строку, если аргумент не является ссылкой, либо один из идентификаторов: * <code>REF</code> – ссылка на ссылку; * <code>SCALAR</code> – ссылка на скаляр; * <code>ARRAY</code> – ссылка на массив скаляров; * <code>HASH</code> – ссылка на хеш-массив; * <code>CODE</code> – ссылка на функцию/процедуру; * <code>GLOB</code> – ссылка на typeglob объект. Ссылки в Perl бывают ''жёсткими'' и ''символическими''. Эти термины не являются изобретением Perl, а перешли в него из Unix. Жесткая ссылка в Perl — это скалярная величина, которая является адресом в памяти, при этом сами данные называются ''субъектом'' этой ссылки. Жесткие ссылки — это истинные ссылки. Таким образом, с самого начала главы мы говорили именно о жестких ссылках. Любая жесткая ссылка внутри Perl увеличивает счетчик использования субъекта ссылки. Субъект будет занимать место в памяти до тех пор, пока на него существует по меньшей мере одна ссылка. Ссылка удаляется, когда счетчик её использования достигает нуля. В свою очередь, счетчик опускается, когда её видимость выходит за блок, в котором она определена. В такой системе, как правило, не происходит утечек памяти из-за ''подвисших ссылок''<ref>''Подвисшей'' называется такая ссылка, которая логически больше не будет использоваться в оставшейся части программы, но её счетчик при этом не равен нулю.</ref>, но такие ситуации всё же могут быть созданы при неправильном программировании. Символическая ссылка в Perl — это скалярная переменная, которая хранит имя другой скалярной переменной. == Определение ссылок == Обычным способом определения ссылки является операция <code>\</code>: <source lang="perl"> $scalar_ref = \3; # ссылка на константу $scalar_ref_1 = $scalar_ref; # ссылка на скаляр $ref_to_ref = \$scalar_ref_1; # ссылка на ссылку $array_ref = \@array; # ссылка на массив $hash_ref = \%hash; # ссылка на хеш-массив $func_ref = \&some_func; # ссылка на функцию </source> С ссылками допустимы все операции, доступные для скаляров, однако, по большому счету все они бессмысленны, кроме присваивания. Основной операцией над ссылками является ''разыменовывание'', т.е. получение данных по ссылке. Способы разыменовавания ссылок мы рассмотрим ниже. === Конструирование анонимного массива скаляров === Имя переменной также выражает имя программного объекта. Perl позволяет конструировать объекты минуя создания переменной, т.е. к таким данным можно обратиться исключительно по ссылке. Такие объекты мы называем ''анонимными'', т.е. к таким объектам нельзя обратиться через переменную (не имеют имени). Чтобы создать анонимный массив, нужно использовать квадратные скобки: <source lang="perl"> $array_ref = [1, 2, 3]; # Анонимный массив с ссылкой, сохраняемой в $array_ref # Предыдущий оператор аналогичен следующим двум $array = (1, 2, 3); $array_ref = \@array; </source> Данный способ является единственным для создания анонимного массива. Язык допускает существование конструкций, смысл которых может быть не очевиден с первого взгляда. Так <source lang="perl"> \($a, $b, $c) # НЕ ОЗНАЧАЕТ анонимный массив с тремя переменными, а является краткой записью (\$a, \$b, \$c) </source> === Конструирование анонимного ассоциативного массива === Чтобы создать анонимный хеш-массив, нужно использовать фигурные скобки: <source lang="perl"> $hash_ref = { 'one' => 1, 'two' => 2, }; # Создает анонимный хеш-массив с ссылкой на него в $hash_ref # Предыдущий оператор аналогичен двум %hash = ('one' => 1, 'two' => 2); $hash_ref = \%hash; </source> === Конструирование анонимной функции === Ссылка на анонимную функцию создается, когда используется ключевое слово <code>sub</code> следющим образом: <source lang="perl"> $func_ref = sub { print "Hello", "\n" }; </source> Язык Perl разрешает вам объявить анонимную процедуру без присваивания<source lang="perl"> # Формально не ошибка сделать так sub { print "@_\n"; }; </source> но сам по себе такой код бесполезен, так как невозможно на него сослаться. Зачастую такой прием используется, чтобы объявить и вызвать процедуру на месте, например, когда нужна одноразовая процедура здесь и сейчас: <source lang="perl"> sub { my $c = 0; foreach my $arg (@_) { printf "ARG#%d: %s\n", $c++, $arg; } }->(1,2,3); # Примечание: операция -> рассмотрена ниже. </source> <pre> ARG#0: 1 ARG#1: 2 ARG#2: 3 </pre> === Конструирование ссылки на объект === Начиная с Perl 5, в язык была добавлена поддержка ООП, основой которого являются ''классы'' и ''объекты''. В Perl доступ к объекту реализован исключительно по ссылке, для создания которой используется специальная функция-конструктор, в которой применяется встроенная функция <code>bless()</code>. Функция-конструктор должна всегда возвращать ссылку. Об ООП в Perl мы поговорим в отдельной главе (''см.'' [[{{Root book name}}/Объектно-ориентированное программирование в Perl|Объектно-ориентированное программирование в Perl]]). === Конструирование typeglob ссылок === Имена всех переменных программы компилятор Perl заносит в специальную таблицу символов. Единицей хранения этой таблицы является так называемое ''гнездо идентификатора''<ref>Имя ссылки <code>glob</code> происходит от слова {{lang-en|global}} — ''глобальный''. Исторически это больше связано не с тем, что определяется что-то глобальное, а то, что под одним идентификатором скрывается множество сущностей. В Unix существует функция <code>glob()</code>, от которой и идёт название, которая по шаблону, переданному ей, разворачивает список значений.</ref>, в которое сохраняются адреса программных объектов, сохраненных под этим идентификатором. Например следующие объекты<source lang="perl"> $a = 5; @a = (1, 2, 3); %a = ("one" => 1); sub a { return 0 }; </source> будут занимать одно гнездо с идентификатором <code>a</code>. В Perl есть возможность получить ссылку на некоторый элемент гнезда с помощью typeglob-ссылки, признаком которой является символ <code>*</code>. Так, имея гнездо, объявленное выше, можно получить ссылки на все программные объекты в нем через такие ссылки: <source lang="perl"> # Аналогично $scalar_ref = *a{SCALAR}; # \$a $array_ref = *a{ARRAY}; # \@a $hash_ref = *a{HASH}; # \%a $code_ref = *a{CODE}; # \&a $glob_ref = *a{GLOB}; # \*a </source> <code>typeglob</code>-ссылки могут использоваться для создания псевдоконстант. Например, следующим образом может быть введена константа Пи: <source lang="perl"> *PI = \3.14159265358979; # Тогда $PI; # это разыменовывание ссылки на константу # При этом $PI нельзя изменить. </source> Кроме перечисленных typeglob-ссылок, существует ещё одна, с помощью которой можно обращаться к файловым дескрипторам: <source lang="perl"> $io_ref = *HANDLE{IO}; # то же $io_ref = *HANDLE; # можно, но не обязательно $io_ref = \*HANDLE; </source> Такая форма появилась вместе с модулем <code>IO::Handle</code> и служит для возврата не совсем ссылки на дескриптор, а ссылки на объект класса <code>IO::Handle</code>. Например, для стандартных дескрипторов всегда будет возвращаться ссылка на объект, имитирующий <code>IO::Handle</code>: <source lang="perl"> for (qw { one two three }) { *STDOUT{IO}->print("$_\n"); } # Вывод: # one # two # three </source> Подробнее о <code>IO::Handle</code> будет рассказано далее (см. [[../Объектно-ориентированное программирование в Perl#Интерфейс IO::Handle|Интерфейс IO::Handle]]). == Разыменовывание ссылок == Разыменованием ссылки называется получение данных, хранящихся в памяти по этой ссылке. Для разыменовывания используются различные синтаксические конструкции, подчас достаточно сложные для визуального восприятия, и к ним нужно просто привыкнуть. Разыменовывание в Perl привязано к типу данных, поэтому для разных типов оно выглядит по разному. Если ссылка является простой скалярной переменной, то при разыменовании нужно использовать соответствующую по типу переменную для операции присваивания, а для ссылки нужно использовать соответствующий идентификатор типа: <source lang="perl"> $var = $$scalar_ref; # Разыменовывание ссылки на скаляр @arr = @$array_ref; # Разыменовывание ссылки на массив %hash = %$hash_ref; # Разыменовывание ссылки на хеш-массив &func = &$code_ref; # Разыменовывание ссылки на функцию # Разыменовывание анонимного массива в lvalue выражении с одновременным порождением ссылки $$array_ref_1[0] = 5; # Разыменовывание анонимного хеш-массива в lvalue выражении с одновременным порождением ссылки $$hash_ref_1{"one"} = 1; </source> Первые четыре разыменовывания выглядят понятно и логично, а последние два немного сложны для понимания, поэтому мы рассмотрим их подробнее. Так как ссылка это скаляр, то сначала произойдет разыменовывание (<code>$$array_ref_1</code>, <code>$$hash_ref_1</code>), и только после этого будет использована индексация (в соответствии с правилами для простых и хеш-массивов). При этом если ссылки до этого не существовали (как в примере), то они будут созданы при присваивании, так как эта операция предполагает их существование. Этот побочный эффект при разыменовывании в lvalue-выражении нужно запомнить. Если ссылка не является простым скаляром (например ссылка хранится в элементе массива), то для ее разыменования нужно использовать блок: <source lang="perl"> ${$array[0]} = 5; ${$hash{"one"}} = 2; ${&f()}[1] = 6; </source> В первом примере предполагается, что в <code>$array[0]</code> массива <code>@array</code> хранится ссылка. Для ее разыменования мы помещаем обращение к ней в массиве в блок, а затем разыменовываем как ссылку из скаляра через <code>$</code> перед блоком. Аналогично мы поступаем, если ссылка хранится в хеш-массиве. В последнем примере мы вызываем функцию <code>f()</code> в блоке, которая возвращает ссылку на массив. Затем мы ее разыменовываем и присваиваем второму элементу массива значение 6. Отметим, что блоки можно использовать и с ссылками, хранящимися в скалярах, например <source lang="perl"> $$array_ref_1[0] = 5; # и ${$array_ref_1}[0] = 5; </source> будут работать одинаково. Но в данном случае фигурные скобки визуально перегружают конструкцию и такое лишнее использование блоков следует избегать на практике. === Операция <code>-></code> === Применение вышеописанных правил разыменования может приводить к появлению громоздких конструкций, вложенных друг в друга, и очень сложных для визуального восприятия. Даже достаточно простые конструкции уже требуют определенного усилия, чтобы их понять, например, сравните <source lang="perl"> ${$a[0]}[1] = 5; ${$b[0]}{"one"} = 1; </source> По этой причине в Perl есть отдельная операция разыменования для массивов в виде стрелки <code>-></code>. Похожую операцию вы могли видеть при разыменовывании указателей в языке Си. Данная операция является бинарной. В левом операнде она ожидает ссылку на массив (простой или хеш-массив), а в правом операнде ожидается индекс массива (в зависимости от типа ссылки). Результатом такого разыменовывания является значение элемента массива или хеш-массива. Таким образом, предыдущий пример может быть компактно записан так: <source lang="perl"> $a[0]->[1] = 5; $b[0]->{"one"} = 1; </source> Благодаря такой записи становится очевидней то, что первая ссылка хранится в массиве <code>@a</code> в первом элементе и является ссылкой на простой массив, а в массиве <code>@b</code> в первом элементе хранится ссылка на хеш-массив. Если ссылки на некоторые массивы хранились бы в скалярных переменных, то запись становится следующей: <source lang="perl"> $array_ref->[0]->[1] = 5; $hash_ref->[0]->{"one"} = 1; </source> В этом примере, если ссылки на массивы не были созданы ранее, то они будут созданы неявно. Использование ссылок таким образом является первым шагом к созданию многоуровневых структур данных. В Perl, при обращении к многоуровневым структурам, допускаются следующие упрощения, о которых следует помнить и пользоваться ими. Например, сравните как эволюционирует обращение к некоторому элементу составного массива: <source lang="perl"> ${${$a[$i]}[$j]}[$k] # то же самое $a[$i]->[$j]->[$k] # то же самое $a[$i][$j][$k] # И для хеш-массива ${${$b[$i]}{"key"}}[$j] # то же самое $b[$i]->{"key"}->[$j] # то же самое $b[$i]{"key"}[$j] </source> Другими словами, знак операции <code>-></code> можно опускать в контексте разыменовывания ссылок на массивы. Этой операцией также разыменовываются ссылки на процедуры/функции. В этом случае правый операнд операции ожидает список аргументов функции в круглых скобках. Сравните <source lang="perl"> $procedure = sub { print "Called: @_\n"; }; # Анонимная функция $procedure->('one', 'two', 'three') ; # Разыменовывание через -> &$procedure ('four', 'five'); # Обычным способом </source> Поначалу работа с многоуровневыми структурами может показаться сложной, однако со временем вы научитесь понимать логику разыменования. == Частые ошибки использования ссылок == Некоторые конструкции, использующие ссылки и кажущиеся с виду нормально, могут вас немало удивить, если не знать особенности их интерпретации. Следующий пример демонстрирует неправильное использование ссылки: <source lang="perl"> # Для печати структуры массива. use Data::Dumper qw(Dumper); sub get_array { return qw { a b c }; } for $i (0..2) { @arr_source = get_array; $arr_target[$i] = \@arr_source; # НЕПРАВИЛЬНО } # Печатаем 1-й раз print Dumper(\@arr_target); $arr_target[1]->[1] = 'e'; # Печатаем 2-й раз print Dumper(\@arr_target); </source> В этом примере мы присваиваем каждому элементу массива <code>@arr_target</code> ссылку на массив <code>@arr_source</code>. Здесь мы наивно полагаем, что компилятор <code>perl</code> внутри цикла будет конструировать переменную <code>@arr_source</code> каждый раз заново, из-за чего ссылка на каждой итерации будет уникальной. Но к сожалению это не так, и результат работы будет следующим: <pre> $VAR1 = [ [ 'a', 'b', 'c' ], $VAR1->[0], $VAR1->[0] ]; $VAR1 = [ [ 'a', 'e', 'c' ], $VAR1->[0], $VAR1->[0] ]; </pre> По печати видно, что все три наши ссылки указывают на одну и ту же область памяти, в которой хранится анонимный массив, а значит изменения по любой из этих ссылок внутри массива <code>@arr_target</code> будут применяться к анонимному массиву, а сам <code>@arr_target</code> с тремя ссылками на один и тот же экземпляр анонимного массива теряет смысл. Решить эту проблему можно минимум тремя способами: * В первом способе следует дать переменной <code>@arr_source</code> лексическую область видимости. Тогда переменная действительно будет конструироваться на каждой итерации по-новому:<source lang="perl"> ... for $i (0..2) { my @arr_source = get_array; # ПРАВИЛЬНО $arr_target[$i] = \@arr_source; # ТЕПЕРЬ ПРАВИЛЬНО } ... </source> Отчасти именно поэтому следует всегда включать директиву <code>use strict;</code>, которая бы требовала это. * Можно пойти с другой стороны и конструировать анонимную ссылку самостоятельно во время присваивания:<source lang="perl"> ... for $i (0..2) { @arr_source = get_array; # МОЖНО НЕ ПИСАТЬ my ... $arr_target[$i] = [ @arr_source ]; # ... ЕСЛИ ССЫЛКА КОНСТРУИРУЕТСЯ В МОМЕНТ ПРИСВАИВАНИЯ. } ... </source> * Можно использовать свойство создания ссылки в момент разыменовывания, но такой способ не самый надежный, так как нужно быть уверенным, что такой ссылки не существует, иначе вы рискуете перетереть предыдущие данные:<source lang="perl"> ... # Этот метод ненадежный, так как требует уверенности, что анонимного массива # не существует. for $i (0..2) { @arr_source = get_array; # МОЖНО НЕ ПИСАТЬ my ... @{$arr_target[$i]} = @arr_source; # ... ЕСЛИ ССЫЛКА КОНСТРУИРУЕТСЯ В МОМЕНТ РАЗЫМЕНОВЫВАНИЯ. } ... </source> Все три способа дадут одинаковый ответ: <pre> $VAR1 = [ [ 'a', 'b', 'c' ], [ 'a', 'b', 'c' ], [ 'a', 'b', 'c' ] ]; $VAR1 = [ [ 'a', 'b', 'c' ], [ 'a', 'e', 'c' ], [ 'a', 'b', 'c' ] ]; </pre> Ещё одной неприятной особенностью Perl является то, что префиксные операции имеют повышенный приоритет перед постфиксными, что ломает логику программистам языков C/C++. Например, запись <source lang="perl"> $$ref[$i]; </source> для программиста на C/C++ трактовалась бы как ''пройти по индексу, а потом разыменовать результат'', но в Perl всё происходит с точностью наоборот — ''разыменовать ссылку, а потом пройти по индексу''. По этой причине, чтобы исключить недопонимание в команде, следует договариваться о том, как лучше записывать разыменовывание: <source lang="perl"> # Так ... $$ref[$i]; # ... так ... ${$ref}[$i]; # ... или так $ref->[$i]; </source> === Подвисшие ссылки === Ниже показан наиболее частый пример подвисшей ссылки — ''циклическая ссылка''. Такую ссылку можно создать в кольцевом буфере из двух элементов. <source lang="perl"> use strict; use warnings; # НЕПРАВИЛЬНО. Код создает утечку памяти из-за циклической ссылки. sub memory_leak { my $head = {}; my $tail = {}; $head->{'tail'} = $tail; $tail->{'head'} = $head; } memory_leak; </source> В этом примере мы конструируем две ссылки на хеши: <code>$head</code> и <code>$tail</code>. Внутри каждого хэша создано ещё по одной ссылке, причём в хеше <code>%$head</code> ссылка <code>$head->{'tail'}</code> ссылается на <code>$tail</code>, а в <code>%$tail</code> ссылка <code>$tail->{'head'}</code> ссылается на <code>$head</code>. Таким образом, у <code>$head</code> и <code>$tail</code> к концу блока процедуры счетчик использования ссылки равен 2. При выходе из блока, счетчик использования каждой ссылки опустится до 1, потому что система увидит, что ссылки <code>my $head</code> и <code>my $tail</code> выходят из зоны видимости блока процедуры, но он никогда не опустится до нуля, потому что ссылки в каждом хэше останутся как бы подвисшими из-за взаимного владения. При вызове этой функции один раз ничего страшного происходить не будет, но при очень большом количестве, память программы будет постепенно тратиться, пока в конечном итоге она не вылетит с ошибкой ''Out of Memory''. В больших программах такую ошибку допустить очень просто, но обнаружить её крайне тяжело. По факту утечка памяти может не проявляться до поры до времени. Увидеть её можно только через отладчик, поэтому при работе с ссылками нужно быть крайне внимательным, если они передаются между различными частями программы: нужно контролировать владельца ссылки, чтобы она случайно не подвисла. Чтобы исправить эту ошибку при такой конфигурации исходного кода, нужно разорвать взаимное владение внутри хешей, сделав одну из ссылок ''слабой''. Слабые ссылки на уровне интерпретации не повышают счетчик использования. <source lang="perl"> use strict; use warnings; use Scalar::Util qw(weaken); # ТЕПЕРЬ ПРАВИЛЬНО. sub fixed_memory_leak { my $head = {}; my $tail = {}; $head->{'tail'} = $tail; $tail->{'head'} = $head; weaken($tail->{'head'}); # Теперь ссылка слабая. } fixed_memory_leak; </source> Теперь ссылка <code>$tail->{'head'}</code> слабая, т.е. она не владеет хешем, на который ссылается <code>$head</code>. Таким образом, к концу процедуры счетчик владения у <code>$head</code> будет 1, а у <code>$tail</code> — 2. Сначала освободится ссылка <code>$head</code>, а в это время у <code>$tail</code> счетчик станет 1. Затем при осовбождении памяти от <code>my $tail</code> её счетчик обнулится и память освободится полностью. == Символические ссылки == Символической ссылкой называется переменная, которая хранит имя другой переменной. Разыменовывание символической ссылки происходит аналогично жесткой ссылке: <source lang="perl"> $ref_var = "var"; # Символическая ссылка на переменную 'var' # Разыменовывание ссылки на скаляр $var с присваиванием. Аналогично $var = 5; $$ref_var = 5; # Разыменовывание ссылки на массив @var с присваиванием. @$ref_var = (1, 2, 3); # Операция -> может использоваться с символическими ссылками $ref_var->[3] = 4; # Аналогично $var[3] = 4; # Разыменовывание ссылки на хеш-массив %var %$ref_var = ("one" => 1, "two" => 2); sub var { print "hello" } # Разыменовывание ссылки на функцию &$ref_var(); </source> Символическая ссылка может указывать только на переменную, имя которой хранится в таблице символов пакета. Это означает, что нельзя ссылаться на локальные переменные, создаваемые при помощи <code>my()</code>, по символическим ссылкам, так как такие переменные в эту таблицу не записываются. <source lang="perl"> $ref_a = "a"; $$ref_a = 1; { my $a = "2"; print $$ref_a; # Напечатается 1, так как my $a не видна этому механизму } print $$ref_a; # Напечатается 1 </source> Символические ссылки в большинстве случаев нежелательны, так как они могут запутывать код и создавать неявные ошибки. В больших программах их использование следует запрещать с помощью директивы <code>use strict 'refs';</code>. На практике по символическим ссылкам обычно передаются и разыменовываются только функции. == Примеры использования ссылок == === Многомерные массивы === Простейшим примером использования ссылок являются многомерные массивы, которые могут быть представлены массивом массивов. Простейшим массивом массивов является матрица, которая представляет числа в виде таблицы. Создать матрицу можно так <source lang="perl"> @matrix = ( [1, 2, 3], [4, 5, 6], [7, 8, 9] ); # Цикл печати матрицы foreach (@matrix) { # Конструкция $#$_ вернет последний индекс массива по ссылке for (my $i=0; $i <= $#$_; $i++) { print $$_[$i], " "; } print "\n"; } </source> === Замыкания === ''Замыкание'' ({{lang-en|closure}}) — это особый вид анонимной функции, внутри которой используются переменные, определенные вне тела этой функции. Замыкания используются, когда нужно сгенерировать несколько процедур, начальные статичные данные для каждой из которых нужно сделать своими. Замыкания в Perl создаются через две функции, одна из которых (внешняя) конструирует анонимную функцию, передавая ей свободные переменные. <source lang="perl"> sub build_closure { my $free = shift; # Свободная переменная return sub { my $closure_var = shift; # Аргумент замыкания return $free + $closure_var; # Переменная $free для замыкания статична } } </source> У замыканий бывают самые разные применения: например, если парсится некая структура, в которой есть разные блоки, но при этом принцип парсинга для каждого из них одинаковый, можно было бы генерировать замыкание для каждого типа блока, передавая в свободных переменных только особенности каждого блока, оставив алгоритм парсинга в функции замыкания; функции-колбеки хорошо ложатся под замыкания; различные hook-функции и другие примеры. Ниже приведен пример замыкания, которое печатает элементы массивов столбиком в зависимости от форматной строки, которая передавалась при конструировании замыкания. <source lang="perl"> sub formatter { my $format = shift; return sub { foreach $element (@_) { printf STDOUT $format, $element; } } } @arr = ("apple", "pear", "grapes"); $print_left = formatter("|%-30s|\n"); $print_right = formatter("|%30s|\n"); $print_left->(@arr); $print_right->(@arr); </source> <source lang="bash"> |apple | |pear | |grapes | | apple| | pear| | grapes| </source> === Вычисленный вызов функции === Используя ссылки и таблицу символов пакета, вы можете вычислить ссылку на любую функцию в нём, открывая тем самым простор для абстрактного программирования, т.е. когда реализации ещё нет, но порядок вызова этой реализации понятен. Рассмотрим такой пример. <source lang="perl"> # Файл: callable.pl sub a { print "Called " . __PACKAGE__ . "::a function\n"; } sub b { print "Called " . __PACKAGE__ . "::b function\n"; } sub c { print "Called " . __PACKAGE__ . "::c function\n"; } $glob = __PACKAGE__ . "::" . $ARGV[0]; print "Trying to find procedure: $glob\n"; if ($glob and *{$glob}{CODE}) { $func_ref = *{$glob}{CODE}; $func_ref->(); } else { print STDERR "[WARN]: Cannot find procedure: $glob\n"; } </source> Здесь мы объявили три процедуры с именами <code>a</code>, <code>b</code> и <code>c</code>. В этой реализации пользователь передает первым аргументом имя процедуры, которую он хочет вызвать. Как вы узнаете позже, если функция не была объявлена в явном пакете, она объявляется в пакете <code>main::</code>. Мы используем макрос <code><nowiki>__PACKAGE__</nowiki></code>, чтобы развернуть на месте имя текущего действующего пакета. Затем мы объединяем имя пакета с именем переданной функции, а затем, используя glob-ссылку, вызываем её, если она объявлена в текущем пакете. <source lang="bash"> $ perl ./callable.pl a Trying to find procedure: main::a Called main::a function $ perl ./callable.pl b Trying to find procedure: main::b Called main::b function $ perl ./callable.pl c Trying to find procedure: main::c Called main::c function $ perl ./callable.pl d Trying to find procedure: main::d [WARN]: Cannot find procedure: main::d </source> == Примечания == {{примечания}} lwjzjir03ubwhl9k4wb942f2shn3l79 Введение в органическую химию/Обзор функциональных групп 0 35593 270049 267207 2026-09-21T18:47:02Z Marbletan 79857 ([[c:GR|GR]]) [[File:Acetyl chloride.png]] → [[File:Acetyl-chloride skeletal.svg]] 270049 wikitext text/x-wiki {{ИИ-страница}} == Введение == Число известных органических соединений весьма велико. Фактически известных органических соединений во много раз больше, чем всех остальных (неорганических) соединений, открытых к настоящему времени, всего около 7 миллионов органических соединений. К счастью, органические химические вещества состоят из относительно небольшого числа сходных частей, соединённых различными способами, что позволяет нам предсказывать, как может реагировать соединение, которого мы никогда раньше не видели, сравнивая его с тем, как, как известно, реагируют другие молекулы, содержащие такие же типы частей. Эти части органических молекул называются функциональными группами. Идентификация функциональных групп и способность предсказывать реакционную способность на основе свойств функциональных групп являются одним из краеугольных камней органической химии. Функциональные группы — это определённые атомы, ионы или группы атомов, обладающие постоянными свойствами. Функциональная группа составляет часть более крупной молекулы. Например, -OH, гидроксильная группа, характеризующая спирты, представляет собой кислород с присоединённым водородом. Она может встречаться в любом числе различных молекул. Подобно тому как элементы имеют отличительные свойства, функциональные группы имеют характерную химию. Группа -OH в одной молекуле будет стремиться реагировать сходно, хотя, возможно, и не идентично, с группой -OH в другой молекуле. Органические реакции обычно происходят на функциональной группе, поэтому изучение реакционной способности функциональных групп подготовит вас к пониманию многих других вещей в органической химии. == Запоминание функциональных групп == Не думайте, что вы можете просто бегло просмотреть функциональные группы и двигаться дальше. По мере продвижения по тексту изложение будет вестись в терминах функциональных групп. Будет предполагаться, что студент знаком с большинством тех, которые приведены в таблицах ниже. Обсуждать химию, не зная «жаргона», просто невозможно. Это похоже на попытку выучить французский, не выучив сначала значения некоторых слов. Один из самых простых способов выучить функциональные группы — сделать карточки. Возьмите пачку карточек и напишите название функциональной группы на одной стороне, а её химическое изображение нарисуйте на другой. Пока здесь приведён список самых важных групп, которые вы должны знать. Ваш первоначальный набор карточек должен включать, как минимум: алкен, алкин, алкилгалогенид (или галогеналкан), спирт, альдегид, кетон, карбоновую кислоту, ацилхлорид (или хлорангидрид кислоты), сложный эфир, простой эфир, амин, сульфид и тиол. После того как вы выучите всё это, добавьте ещё пару карточек и выучите их. Затем добавьте ещё несколько и выучите их. Каждая функциональная группа ниже в конце концов обсуждается в книге в тот или иной момент. Но приведённый выше список даст вам то, что нужно, чтобы продолжать. И не просто смотрите на карточки. Произносите и пишите названия и рисуйте структуры. Чтобы проверить себя, попробуйте пройти по карточкам, смотреть на названия и затем рисовать их структуру на листе бумаги. Затем попробуйте пройти по карточкам, смотреть на структуры и называть их. Письмо — хороший метод, помогающий запоминанию, потому что оно более активно, чем простое чтение. Когда вы выучите минимальный список выше в обоих направлениях, вы готовы двигаться дальше. Но не прекращайте учить группы. Если вы решите двигаться дальше, не выучив «жаргон», то вы не будете понимать язык следующих глав. Снова используя аналогию с французским, это похоже на попытку игнорировать изучение словаря, а затем взять роман на французском и ожидать, что вы сможете его прочитать. === Функциональные группы, содержащие ... === В [[organic chemistry|органической химии]] функциональные группы — это субмолекулярные структурные мотивы, характеризующиеся определённым элементным составом и связностью, которые придают реакционную способность молекуле, их содержащей. К распространённым функциональным группам относятся: {| class="wikitable" ! № ! Химический класс ! Группа ! Формула ! Графическая формула ! Приставка ! Суффикс ! Пример |- | 1 | [[Acyl halide|Ацилгалогенид]] | Галоформил | RCOX | [[Image:Acyl halide.png|50px]] | haloformyl- | -oyl halide | [[Image:Acetyl-chloride skeletal.svg|50px]]<br />[[w:Acetyl chloride|Ацетилхлорид]]<br />(этаноилхлорид) |- | 2 | [[Alcohol|Спирт]] | Гидроксил | OH | [[Image:Hydroxyl.png|50px]] | hydroxy- | -ol | [[Image:Methanol.png|50px]]<br />[[w:Methanol|Метанол]] |- | 3 | [[Aldehyde|Альдегид]] | [[Aldehyde|Альдегид]] | RCHO | [[Image:Aldehyde.png|50px]] | oxo- | -al | [[Image:Acetaldehyde.png|50px]]<br />[[w:Acetaldehyde|Ацетальдегид]]<br />(этаналь) |- | 4 | [[Alkane|Алкан]] | [[w:Alkyl|Алкил]] | RH<sub>n</sub> | [[Image:Alkyl.png|50px]] | alkyl- | -ane | [[Image:Methane.png|50px]]<br />[[w:Methane|Метан]] |- | 5 | [[Alkene|Алкен]] | [[Alkenyl|Алкенил]] | R<sub>2</sub>C=CR<sub>2</sub> | [[Image:Alkene.png|50px]] | alkenyl- | -ene | [[Image:Ethylene.png|50px]]<br />[[w:Ethylene|Этилен]]<br />(этен) |- | 6 | [[Alkyne|Алкин]] | [[Alkynyl|Алкинил]] | RC≡CR' | [[Image:Alkyne.png|50px]] | alkynyl- | -yne | [[Image:Acetylene.png|50px]]<br />[[w:Acetylene|Ацетилен]]<br />(этин) |- | 7 | [[Amide|Амид]] | [[w:Carboxamide|Карбоксамид]] | RCONR<sub>2</sub> | [[Image:Amide.png|50px]] | carboxamido- | -amide | [[Image:Acetamide.png|50px]]<br />[[w:Acetamide|Ацетамид]]<br />(этанамид) |- | rowspan="4" | 8 | rowspan="4" | [[Amines|Амины]] | [[Primary amine|Первичный амин]] | RNH<sub>2</sub> | [[Image:Primary amine.png|50px]] | amino- | -amine | [[Image:Methylamine.png|50px]]<br />[[w:Methylamine|Метиламин]]<br />(метанамин) |- | [[Secondary amine|Вторичный амин]] | R<sub>2</sub>NH | [[Image:Secondary amine.png|50px]] | amino- | -amine | [[Image:Dimethylamine.png|50px]]<br />[[w:Dimethylamine|Диметиламин]] |- | [[Tertiary amine|Третичный амин]] | R<sub>3</sub>N | [[Image:Tertiary amine.png|50px]] | amino- | -amine | [[Image:Trimethylamine.png|50px]]<br />[[w:Trimethylamine|Триметиламин]] |- | [[4° ammonium ion|4° аммоний-ион]] | R<sub>4</sub>N+ | [[Image:Quaternary ammonium cation.png|50px]] | ammonio- | -ammonium | [[Image:Choline.png|50px]]<br />[[w:Choline|Холин]] |- | 9 | [[Azo compound|Азосоединение]] | [[w:Azo (Diimide)|Азо (диимид)]] | RN<sub>2</sub>R' | [[Image:Azo.png|50px]] | azo- | -diazene | [[Image:Methyl orange.png|50px]]<br />[[w:Methyl orange|Метилоранж]] |- | 10 | [[w:Toluene derivative|Производное толуола]] | [[w:Benzyl|Бензил]] | RCH<sub>2</sub>C<sub>6</sub>H<sub>5</sub><br />RBn | [[Image:Benzyl.png|50px]] | benzyl- | 1-(substituent)toluene | [[Image:Benzyl bromide.png|50px]]<br />[[w:Benzyl bromide|Бензилбромид]]<br />(1-бромтолуол) |- | 11 | [[Carbonate|Карбонат]] | [[w:Carbonate ester|Карбонатный эфир]] | ROCOOR | [[Image:Carbonate.png|50px]] | | alkyl carbonate | |- | 12 | [[Carboxylate|Карбоксилат]] | [[w:Carboxylate|Карбоксилат]] | RCOO− | [[Image:Carboxylate.png|50px]] | carboxy- | -oate | [[Image:Sodium acetate.png|50px]]<br />[[w:Sodium acetate|Ацетат натрия]]<br />(этаноат натрия) |- | 13 | [[Carboxylic acid|Карбоновая кислота]] | [[w:Carboxyl|Карбоксил]] | RCOOH | [[Image:Carboxylic acid.png|50px]] | carboxy- | -oic acid | [[Image:Acetic acid.png|50px]]<br />[[w:Acetic acid|Уксусная кислота]]<br />(этановая кислота) |- | rowspan="2" | 14 | rowspan="2" | [[Cyanates|Цианаты]] | [[w:Cyanate|Цианат]] | ROCN | [[Image:Cyanate.png|50px]] | cyanato- | alkyl cyanate | |- | [[Thiocyanate|Тиоцианат]] | RSCN | [[Image:Thiocyanate.png|50px]] | thiocyanato- | alkyl thiocyanate | |- | 15 | [[Ether|Простой эфир]] | [[w:Ether|Простой эфир]] | ROR' | [[Image:Ether.png|50px]] | alkoxy- | alkyl alkyl ether | [[Image:Diethyl ether.png|50px]]<br />[[w:Diethyl ether|Диэтиловый эфир]]<br />(этоксиэтан) |- | 16 | [[Ester|Сложный эфир]] | [[w:Ester|Сложный эфир]] | RCOOR' | [[Image:Ester.png|50px]] | | -oate | [[Image:Ethyl butyrate.png|50px]]<br />[[w:Ethyl butyrate|Этилбутират]]<br />(этилбутаноат) |- | 17 | [[Haloalkane|Галогеналкан]] | [[w:Halo|Гало]] | RX | [[Image:Halide group.png|50px]] | halo- | alkyl halide | [[Image:Chloroethane.png|50px]]<br />[[w:Chloroethane|Хлорэтан]]<br />(этилхлорид) |- | 18 | Гидропероксид (см. [[w:Organic peroxide|органический пероксид]]) | [[w:Hydroperoxy|Гидроперокси]] | ROOH | [[Image:Hydroperoxy.png|50px]] | hydroperoxy- | alkyl hydroperoxide | [[Image:Methyl ethyl ketone peroxide.png|50px]]<br />[[w:Methyl ethyl ketone peroxide|Пероксид метилэтилкетона]] |- | rowspan="4" | 19 | rowspan="4" | [[Imine|Имин]] | Первичный кетимин | RC(=NH)R' | [[Image:Imine.png|50px]] | imino- | -imine | |- | Вторичный кетимин | RC(=NR'')R' | [[Image:Imine.png|50px]] | imino- | -imine | |- | Первичный альдимин | RC(=NH)H | [[Image:Imine.png|50px]] | imino- | -imine | |- | Вторичный альдимин | RC(=NR')H | [[Image:Imine.png|50px]] | imino- | -imine | |- | 20 | [[Isocyanide|Изоцианид]] | [[w:Isocyanide|Изоцианид]] | RNC | | isocyano- | alkyl isocyanide | |- | rowspan="2" | 21 | rowspan="2" | [[Isocyanates|Изоцианаты]] | [[w:Isocyanate|Изоцианат]] | RNCO | [[Image:Isocyanate.png|50px]] | isocyanato- | alkyl isocyanate | |- | [[Isothiocyanate|Изотиоцианат]] | RNCS | [[Image:Isothiocyanate.png|50px]] | isothiocyanato- | alkyl isothiocyanate | [[Image:Allyl isothiocyanat.png|50px]]<br />[[w:Allyl isothiocyanate|Аллилизотиоцианат]] |- | 22 | [[Ketone|Кетон]] | [[w:Ketone|Кетон]] | RCOR' | [[Image:Ketone.png|50px]] | keto-, oxo- | -one | [[Image:Butanone.png|50px]]<br />[[w:Methyl ethyl ketone|Метилэтилкетон]]<br />(бутанон) |- | 23 | [[Nitrile|Нитрил]] | [[w:Nitrile|Нитрил]] | RCN | [[Image:Nitrile.png|50px]] | cyano- | alkane nitrile<br />alkyl cyanide | [[Image:Benzonitrile.png|50px]]<br />[[w:Benzonitrile|Бензонитрил]]<br />(фенилцианид) |- | 24 | [[Nitro compound|Нитросоединение]] | [[w:Nitro|Нитро]] | RNO<sub>2</sub> | [[Image:Nitro.png|50px]] | nitro- | | [[Image:Nitromethane.png|50px]]<br />[[w:Nitromethane|Нитрометан]] |- | 25 | [[Nitroso compound|Нитрозосоединение]] | [[w:Nitroso|Нитрозо]] | RNO | [[Image:Nitroso.png|50px]] | nitroso- | | [[Image:Nitrosobenzene.png|50px]]<br />[[w:Nitrosobenzene|Нитрозобензол]] |- | 26 | [[Peroxide|Пероксид]] | [[Hydroperoxy|Перокси]] | ROOR | [[Image:Peroxy.png|50px]] | peroxy- | alkyl peroxide | [[Image:Di-tert-butyl peroxide.png|50px]]<br />[[w:Di-tert-butyl peroxide|Ди-трет-бутилпероксид]] |- | 27 | [[w:Benzene derivative|Производное бензола]] | [[w:Phenyl|Фенил]] | RC<sub>6</sub>H<sub>5</sub> | [[Image:Phenyl.png|50px]] | phenyl- | -benzene | [[Image:Cumene.png|50px]]<br />[[w:Cumene|Кумол]]<br />(2-фенилпропан) |- | 28 | [[Phosphine|Фосфин]] | Фосфино | R<sub>3</sub>P | [[Image:A tertiary phosphine.png|50px]] | phosphino- | -phosphane | [[Image:Methylpropylphosphane.png|50px]]<br />Метилпропилфосфан |- | 29 | [[Phosphodiester|Фосфодиэфир]] | [[w:Phosphate|Фосфат]] | HOPO(OR)<sub>2</sub> | [[Image:Phosphodiester.png|50px]] | phosphoric acid di(substituent) ester | di(substituent) hydrogenphosphate | [[w:DNA|ДНК]] |- | 30 | [[Phosphonic acid|Фосфоновая кислота]] | Фосфоно | RP(=O)(OH)<sub>2</sub> | [[Image:Phosphono group.png|50px]] | phosphono- | substituent phosphonic acid | [[Image:Benzylphosphonic acid.png|50px]]<br />Бензилфосфоновая кислота |- | 31 | [[Phosphate|Фосфат]] | Фосфат | ROP(=O)(OH)<sub>2</sub> | [[Image:Phosphate group.png|50px]] | phospho- | | [[Image:Glyceraldehyde 3-phosphate.png|50px]]<br />[[w:Glyceraldehyde 3-phosphate|Глицеральдегид-3-фосфат]] |- | 32 | [[Pyridine derivative|Производное пиридина]] | [[w:Pyridyl|Пиридил]] | RC<sub>5</sub>H<sub>4</sub>N | [[Image:4-pyridyl group.png|50px]]<br />[[Image:3-pyridyl group.png|50px]]<br />[[Image:2-pyridyl group.png|50px]] | 4-pyridyl<br />(pyridin-4-yl)<br /><br />3-pyridyl<br />(pyridin-3-yl)<br /><br />2-pyridyl<br />(pyridin-2-yl) | -pyridine | [[Image:Nicotine.png|50px]]<br />[[w:Nicotine|Никотин]] |- | 33 | [[Sulfide|Сульфид]] | | RSR' | [[Image:Sulfide group.png|50px]] | | di(substituent) sulfide | [[Image:Dimethyl sulfide.png|50px]]<br />[[w:Dimethyl sulfide|Диметилсульфид]] |- | 34 | [[Sulfone|Сульфон]] | [[w:Sulfonyl|Сульфонил]] | RSO<sub>2</sub>R' | [[Image:Sulfonyl group.png|50px]] | sulfonyl- | di(substituent) sulfone | [[Image:Dimethyl sulfone.png|50px]]<br />Диметилсульфон<br />([[w:Methylsulfonylmethane|метилсульфонилметан]]) |- | 35 | [[Sulfonic acid|Сульфоновая кислота]] | Сульфо | RSO<sub>3</sub>H | [[Image:Sulfonyl group.png|50px]] | sulfo- | substituent sulfonic acid | [[Image:Benzenesulfonic acid.png|50px]]<br />Бензолсульфоновая кислота |- | 36 | [[Sulfoxide|Сульфоксид]] | [[w:Sulfinyl|Сульфинил]] | RSOR' | [[Image:Sulfinyl group.png|50px]] | sulfinyl- | di(substituent) sulfoxide | [[Image:Diphenyl sulfoxide.png|50px]]<br />Дифенилсульфоксид |- | 37 | [[Thiol|Тиол]] | [[w:Sulfhydryl|Сульфгидрил]] | RSH | [[Image:Sulfhydryl.png|50px]] | mercapto-, sulfanyl- | -thiol | [[Image:Ethanethiol.png|50px]]<br />[[w:Ethanethiol|Этантиол]]<br />(этилмеркаптан) |} Примечание: таблица выше адаптирована из таблицы функциональных групп в [[w:Wikipedia|Wikipedia]]. Сочетание названий функциональных групп с названиями родительских [[w:alkanes|алканов]] создаёт мощную [[w:systematic nomenclature|систематическую номенклатуру]] для называния [[w:organic compounds|органических соединений]]. Неводородные атомы функциональных групп всегда связаны друг с другом [[w:covalent bonds|ковалентными связями]], а также с остальной частью молекулы. Когда группа атомов связана с остальной частью молекулы преимущественно ионными силами, такую группу более правильно называют [[w:polyatomic ion|многоатомным ионом]] или [[w:complex ion|комплексным ионом]]. И все они называются [[w:radicals|радикалами]] в том значении термина «радикал», которое предшествует [[w:free radical|свободному радикалу]]. Первый углерод после углерода, который присоединяется к функциональной группе, называется [[w:alpha carbon|альфа-углеродом]]. Спирты, содержащие две гидроксильные группы, называются гликолями. У них есть как тривиальные названия, так и названия IUPAC. == Мнемоники для функциональных групп == Это возможные мнемоники для распространённых функциональных групп. Гласные: запомните гласные «A», «E» и «Y» для Alkane, Alkene и Alkyne. Алканы имеют только одинарные ковалентные связи. Алкены имеют по меньшей мере одну двойную связь. Алкины имеют по меньшей мере одну тройную связь. Буквы «I», «O» и «U» не используются. Кроме того, «O» и «U» дали бы неудобные произношения. Спирт: ищите «C-O-H» в «Alcohol». Простой эфир: эфиры были анестетиками, использовавшимися в 1800-х годах. Доктор Келлогг также жил в то же время. Corn Flakes производятся Kellogg's. Петух, или cock (C-O-C), является талисманом кукурузных хлопьев. Или думайте, что C находится с «either» стороны от O. Амин: помните, что «N» означает nitrogen. Альдегид: это звучит как «Adelaide», австралийский город. Австралия находится в конце азиатских островов, а альдегиды находятся в конце углеводородной цепи. «Y» указывает на двойную связь C=O. Кетон: представьте диагональные штрихи «K», образующие двойную связь C=O. [[Image:Ketone mnemonic.png]] Карбоновая кислота: «Box» означает boxed wine или C-O-H, спирт. «Y» указывает на двойную связь C=O. Сложный эфир: это звучит как «Estelle», мать Джорджа Костанзы в телешоу Seinfeld. Прозвищем Джорджа было Koko или Coco. Поэтому думайте об O=C-O-C. Амид: амин с «D». D означает double. [[Image:Functional groups mnemonic.png]] {{BookCat}} 02ao3ml8ybrr8e5fdvtfaicplenp6kd