Викиучебник
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.23
first-letter
Медиа
Служебная
Обсуждение
Участник
Обсуждение участника
Викиучебник
Обсуждение Викиучебника
Файл
Обсуждение файла
MediaWiki
Обсуждение MediaWiki
Шаблон
Обсуждение шаблона
Справка
Обсуждение справки
Категория
Обсуждение категории
Полка
Обсуждение полки
Импортировано
Обсуждение импортированного
Рецепт
Обсуждение рецепта
Задача
Обсуждение задачи
TimedText
TimedText talk
Модуль
Обсуждение модуля
Event
Event talk
Интересное обществознание/Введение к учебнику как манифест против схоластики и старых лгунов в общественных науках
0
29320
270335
265319
2026-10-10T05:34:41Z
ВалерийСтариков
79536
270335
wikitext
text/x-wiki
<!-- Введение -->
'''Видео " Государственные учебники по обществознанию не пригодны для преподавания. " можно посмотреть здесь:'''
https://www.youtube.com/watch?v=kBOKo3XytQY&ab_channel=%D0%92%D0%B0%D0%BB%D0%B5%D1%80%D0%B8%D0%B9%D0%A1%D1%82%D0%B0%D1%80%D0%B8%D0%BA%D0%BE%D0%B2
===История создания этого учебника===
[[Файл:Лейбович, Олег Леонидович2.jpg|thumb|200px|Лейбович Олег Леонидович]]
Я писал этот учебник 30 лет. Я опубликовал свой учебник не только на российском сайте Викиучебник, но и на англоязычном сайте Wikibooks под названием Valery Starikov "Interesting social sciences"<ref name="Стариков 1" />. Я переводил текст своего учебника с русского языка на английский язык ещё 7 лет и до сих пор продолжаю эту работу. Для этого мне пришлось овладеть искусством перевода с русского на английский язык, что является очень сложной задачей для автора, для которого английский язык не является родным. Я никогда не был за границей и не погружался в англоязычную среду, но нужно было написать английский текст своего учебника так, чтобы англичане и американцы тебя понимали. Чтобы сократить работу по переводу своего учебника на английский язык, я сократил текст своего русского учебника в 2 раза, я вырезал все биографии, кодексы законов и многие параграфы по экономике. Я выбрал для перевода и сохранил в англоязычном учебнике самую главную и самую интересную информацию из текста русского учебника. Оказалось, что текст моего учебника можно легко перевести на английский по той причине, что тексты являются ясными, лаконичными и интересными по стилю изложения. Если у меня возникали проблемы с переводом какого-нибудь предложения, то я упрощал стиль этого предложения до предела. Только схоластику невозможно переводить на английский язык. Я сегодня шлифую перевод своего учебника. Если меня пустили на англоязычный раздел, то всё там должно быть прекрасно - и перевод, и ссылки и картинки. Сегодня я читаю статьи на англоязычной Википедии и сравниваю их с параграфами из своего учебника, я не хочу попасть впросак, нас учили в СССР по книгам советских авторов в условиях цензуры, а может быть нас учили неправильно и эти авторы давали неверную информацию о западной социологии? Для русскоязычного переводчика переводить с английского языка на русский - это просто, можно просто переврать исходный текст и русскоязычные читатели всегда поймут твой русскоязычный текст, но для русскоязычного переводчика перевести русскоязычный текст на английский и так, чтобы англоязычные читатели понимали твой текст - это высший класс для переводчика. Но я взял на себя эту трудную задачу ради исполнения своей мечты. США - это Мекка для социологов, все социологи мира учатся у американских социологов, многие социологи со всего мира уехали в США за своей мечтой, но не всем удалось там пробиться и внести значительный вклад в развитие мировой социологии как науки. Пример такого успешного отъезда и большого вклада - это история русского социолога Питирима Сорокина, который происходил из республики Коми, и, спасаясь от большевиков, уехал из России в США и изобрёл там две оригинальных теории - социологию революции, теорию социальной стратификации и социальной мобильности. В конце жизни Сорокин стал президентом Американской социологической ассоциации, то есть ведущим американским социологом. А сегодня можно сидеть в России в глубокой провинции на Урале и долгими зимними вечерами публиковать свой учебник в англоязычном разделе. Слава изобретателям интернета! Я родился в нужное время и в нужном месте. Я давно решил, что эмиграция - это не для меня, ностальгия меня замучит. Я когда-то пытался опубликовать свою статью о теории взаимосвязи между конфликтом и контролем в главном американском социологическом журнале "International sociology", но американские редакторы этого журнала мне отказали в публикации. А сегодня я опубликовал свой учебник в 350 страниц на англоязычном Wikibooks. С целью совершенствования своих навыков переводчика и с целью рекламы своих идей я 2 года размещал отдельные параграфы из своего учебника в переводе на английский язык на англоязычных научных и политических форумах, а затем общался и обсуждал эти свои статьи с участниками форума (англичанами и американцами). Прежде всего меня интересовал вопрос, понимают ли они мои тексты? Они отвечали мне на форумах, что они вполне меня понимают, но мой литературный стиль - плохой, сразу видно, что английский язык не является для меня родным, хотя я и изучал английский язык по словарям и учебникам около 50 лет. Если бы они меня не понимали, то количество посещений моего англоязычного учебника было бы самым минимальным, но я сегодня имею большое количество посещений моего учебника на англоязычном Wikibooks, хотя и меньше, чем на русскоязычном Викиучебнике, я это могу объяснить только невысоким качеством моего перевода, поэтому я и трачу сегодня много времени и усилий на шлифовку качества моего перевода. Я начинал переводить свой учебник ещё с помощью бумажного словаря, а сегодня я использую электронный переводчик PROMT. Я больше доверяю бумажному словарю, чем электронному переводчику в том, что касается качества перевода, но использование электронного переводчика во много раз ускоряет работу по сравнению с использованием бумажного словаря. Этот электронный переводчик даёт низкое качество перевода, но если перевести русский текст на английский, а затем тот же текст с английского на русский, то вылазят все ошибки в переводе (исходный русский текст не совпадает с конечным русским текстом), эти ошибки в переводе необходимо исправить с помощью упрощения исходного русского текста и с помощью бумажного словаря. Я перевёл свой учебник с русского на английский 3 раза и каждый раз находил ошибки, хотя их было всё меньше и меньше вместе с ростом качества моих навыков переводчика. Проблема состоит в том, что мой учебник имеет слишком большой объём - около 350 страниц, поэтому этот многократный перевод, это шлифование перевода потребовало от меня много времени.
Я могу дать несколько советов другим начинающим русскоязычным переводчикам:
* Нужно избегать использовать в русском тексте слова - омонимы, которые имеют несколько значений (примеры омонимов: бор, коса, эфир, наряд, горн), потому что электронный словарь не понимает, какое из нескольких значений слова вы имеете в виду.
* Нужно учитывать, что в английском языке падежи передаются с помощью предлогов, а не с помощью окончаний как в русском языке, поэтому эти предлоги нельзя путать, иначе англичане тебя просто не поймут.
* Все понятия, имена и содержание теорий в учебнике нужно уточнять и перепроверять по англоязычной Википедии, иначе можно попасть впросак.
* Можно ограничиться при переводе самой простой и примитивной английской грамматикой и этого будет достаточно для начинающего переводчика. Я использовал только прошедшее, настоящее и будущее время (Past, Present and Future Tense), действительный и страдательный залоги (Active and Passive Voice), Indefinite, Perfect and Continious Tense.
Главное ядро моего учебника – это моя теория взаимосвязи между социальным конфликтом и социальным контролем. Отношения конфликта и контроля – это главные отношения между людьми в обществе. Я впервые представил эти идеи о роли конфликта и контроля в обществе в 1980 году в качестве курсовой работы на втором курсе философского факультета Уральского государственного университета (Екатеринбург), мне не удалось тогда найти в университете квалифицированного специалиста и научного руководителя по этой теме. На втором курсе я ещё ничего не слышал о западной социологии и поэтому я считал свою теорию взаимосвязи между конфликтом и контролем как разновидность Общей теории систем. Я читал работы Карла Маркса, Фридриха Энгельса и Владимира Ленина только на первом курсе философского факультета и с тех пор был настроен критически к марксизму и диалектике Гегеля. Хотя преподаватели в университете заставляли нас изучать именно марксизм и диалектику при советской власти, как самые мудрые теории. Когда я начал читать статьи на англоязычной Википедии, я был очень удивлен большим уважением к марксизму на Западе. Россия заплатила огромную цену за свое увлечение марксистскими утопиями во время коммунистического эксперимента. В итоге в своём учебнике я опроверг и похоронил марксизм и диалектику как псевдонаучные теории. Я забил осиновый кол в сердце призрака коммунизма, о котором Карл Маркс и Фридрих Энгельс писали в работе "Манифест коммунистической партии" ("Призрак бродит по Европе - призрак коммунизма"<ref name="Манифест" />).
Я слушал лекции по психологии на первом курсе Уральского государственного университета, которые читал профессиональный гипнотизёр профессор Матвеев, который объяснил нам сущность гипноза. Я использовал лекции Матвеева при написании параграфа о гипнозе. Я считаю гипноз разновидностью психологического контроля. На первом курсе университета я написал курсовую работу на тему "Поиски первоосновы вещей в греческой физике" (См. параграф "Теория прогрессивного развития физического мира"), научный руководитель - доктор философских наук Звиревич Витольд Титович <ref name="Звиревич 1" />, автор учебника "Философия Древнего мира и Средних веков" <ref name="Звиревич" />. На третьем курсе я увлёкся математической логикой и написал курсовую работу по деонтической логике, научный руководитель - доктор философских наук Лобовиков Владимир Олегович <ref name="Лобовиков 1" />, автор нескольких книг по математической логике. Конечно, я не стал излагать основы математической логики в школьном учебнике по обществознанию. Но я смог изложить в своём учебнике основы формальной логики в виде списка логических ошибок или уловок, это поможет ученикам вести дискуссию и ловить за руку оппонентов на этих логических уловках, как мошенников в споре. Мой опыт преподавания показал, что если ты начинаешь преподавать формальную логику более глубоко в средней школе, то ученики перестают тебя понимать, это слишком сложно для их уровня восприятия. Поэтому я и ограничился в своём учебнике только списком логических ошибок или уловок (См. параграф *Древнегреческая диалектика и формальная логика"). Изучение школ и направлений в западной социологии (См. параграф "Развитие академической социологии в 19-20 вв") на 6 курсе университета стало для меня шоком, особенно по сравнению с отсталым советским марксизмом и диалектикой Гегеля, которые я уже тогда считал псевдонаукой. Эти лекции по истории западной социологии читал Ушаков Валерий Михайлович, по слухам, этот самый талантливый из моих преподаватель был в конфликте с преподавателями марксизма в университете, поэтому он уволился из университета, женился на мексиканке и уехал в Мексику, занялся гостиничным бизнесом и следы Ушакова затерялись. Очень жаль, что он не оставил научных работ, я не слышал в своей жизни ничего более интересного, чем его лекции по истории западной социологии, но я сохранил конспект его лекций и использовал этот конспект при написании своего учебника, поэтому дело Валерия Михайловича Ушакова живёт в моём учебнике. «Пепел Клааса стучит в мое сердце». Механизм религиозного контроля (См. одноимённый параграф в моём учебнике) стал темой для моей дипломной работы при окончании университета в 1985 году, моим научным руководителем был ныне покойный кандидат философских наук Колосницын Всеволод Иванович <ref name="Колосницын 1"/> , автор учебника по научному атеизму <ref name="Колосницын 2" />. В 1985 году я сдавал государственный экзамен по научному коммунизму, уже всем было ясно, что научный коммунизм- это лженаука, но экзаменаторы были поэтому особенно злы и поставили две неудовлетворительные отметки студентам из нашей группы. Что касается меня, то я врал отчаянно, как Хлестаков из комедии Н. В. Гоголя "Ревизор" и обещал, что при коммунизме все блага польются широким потоком, раскрывай рот шире, в итоге эта фраза обеспечила мне удовлетворительную отметку на государственном экзамене по научному коммунизму, а на другой день я получил диплом университета. А те двое моих друзей, которые получили неудовлетворительную отметку за государственный экзамен по научному коммунизму получили право пересдать этот экзамен только через год. Рецензентом первого издания моего учебника "Занимательная социология" стал Лейбович Олег Леонидович <ref name="Лейбович 1" />. Моим соавтором по второму изданию учебника "Интересное обществознание" стал доктор экономических наук Липсиц Игорь Владимирович <ref name="Липсиц 1" />, автор самых лучших учебников в России по экономике <ref name="Липсиц" />. Я увлекался многими общественными науками в процессе обучения, что и помогло мне написать учебник по обществознанию, автор такого учебника должен иметь универсальные знания, узкая специализация здесь только вредит.
В 1990 году в городской газете "Березниковский рабочий" состоялась моя дискуссия против преподавателей советской истории и научного коммунизма из БФ ПНИПУ ныне покойного кандидата философских наук Захарова Юрия Романовича <ref name="Захаров 1" />и доктора исторических наук Бакулина Владимира Ивановича <ref name="Бакулин 1" />. В городской газете я назвал их "вечно вчерашними", а они меня "городским летописцем". Захаров тогда работал третьим секретарём горкома КПСС по идеологии. Затем состоялся "политический ринг" в форме дискуссии Стариков против Бакулина на тему "Коммунизм - это утопия или будущее человечества?" на чужой для меня территории - в горкоме КПСС в присутствии зрителей. Судьями на этом ринге были представители обкома КПСС, которые присудили нмчью. Эту дискуссию освещала городская газета. В дальнейшем Бакулин уехал в Киров, преподаёт в Кировском государственном педагогическом университете. Захаров был хорошим человеком, но наивным утопистом, он мечтал осчастливить человечество и изобрести модель коммунистического самоуправления, где человек человеку друг, товарищ и брат. Миру - мир. Но по моей теории взаимосвязи между конфликтом и контролем выходит, что коммунизм - это утопия, сказка для взрослых. что люди ведут между собой конфликт за статус контролёра. По моему мнению, человек человеку - это конкурент, союзник в конфликте, контролёр или объект контроля. Как сказал Томас Гоббс "Человек человеку - волк". А Чарльз Дарвин учил, что выживает сильнейший и самый приспособленный. А проигравший пусть плачет. Вот сущность наших разногласий с Захаровым. В дальнейшем мы сотрудничали с Захаровым и он стал моим рецензентом, но каждый из нас остался при своём мнении относительно перспектив коммунизма, Захаров продолжал твердить до самой смерти, что Карл Маркс - это гений всех времён и народов. Эти дискуссии позволили мне отточить свои аргументы против против марксистов и коммунистов.
Я использовал свой учебник в качестве хрестоматии в процессе преподавания обществознания в средней школе в течение 13 лет. Для преподавания я выбрал учебник Кравченко, этот халявский слишком короткий учебник содержит всего 10 параграфов на 50 часов учебного времени в течении учебного года. Таким образом, 40 учебных часов в год остаётся резервным временем, которое я и заполнял преподаванием по своему учебнику. Кравченко, в отличие от Боголюбова, хотя бы знает и упоминает фамилии классиков социологии, что давало мне право излагать теории этих классиков социологии и, тем самым, право отмахиваться от придирок завучей в школе, которые задавали мне резонный вопрос:"Почему ты преподаёшь не по государственному учебнику? Где ты взял эту информацию о теориях классиков социологии?". Мне приходилось им указывать на упоминания в учебнике Кравченко фамилий классиков социологии и показывать работы этих классиков социологии из своей домашней библиотеки. Это преподавание позволило мне писать новые статьи и оттачивать стиль сочинений. Я публиковал свои идеи в межвузовских сборниках в 24 статьях. Рецензентами моих статей в этих научных сборниках были кандидат исторических наук Шилов Владимир Викторович <ref name="Шилов 1" />, кандидат философских наук Захаров Юрий Романович, кандидат медицинских наук заведующий кафедрой психологии БФ ПГНИУ Узлов Николай Дмитриевич<ref name="Узлов 1" />, кандидат технических наук Беккер Вячеслав Филиппович <ref name="Беккер 1" />. Узлов стал рецензентом моих статей о типах личности. Эти научные сборники издавались малыми тиражами и их почти никто не читал в отличие от моего учебника на Викиучебнике, но публикации в этих сборниках позволили мне отправить свои статьи на предварительную экспертизу на научность, прежде чем публиковать их на Викиучебнике. Конечно, березниковские и пермские научные сборники являются менее авторитетными источниками по сравнению со столичными толстыми социологическими журналами, но всё же эти сборники имеют какой-то минимальный авторитет в социологии, ни один рецензент не будет позориться и публиковать в своём сборнике откровенную лженаучную статью неадекватного автора. Эти статьи в научных сборниках из-за малого количества читателей и малого тиража в 250 экземпляров пишутся по принципу: сам пишу, сам читаю, молодец! Это не может идти ни в какое сравнение с сотнями и тысячами посещений моих статей и моего учебника на Википедии. Поэтому я потратил на публикации своих статей в научных сборниках 13 лет (с 1994 до 2007 гг.), по 1 или 2 статьи в год, а затем я ушёл в интернет и начал публиковать свой учебник сначала в на второстепенных сайтах, а затем - на Википедии. Я живу в городе Березники в глубокой провинции на Урале и поэтому я был вынужден ездить за книгами классиков западной социологии в Пермь, Екатеринбург и Москву, наличие такой богатой домашней библиотеки часто помогало мне в дальнейшем делать ссылки на работы классиков социологии в своём учебнике с указанием страниц. Хотя, сегодня тексты этих старых работ на русском и на английском языке можно легко найти в интернете. Но я начинал писать свой учебник ещё до изобретения интернета.
Я издал за свои деньги брошюру «Пусть проигравший плачет» (5000 экземпляров, 8 страниц) в 1992 году. Эта брошюра была посвящена теории о взаимосвязи между конфликтом и контролем. Я издал за свои деньги свой учебник «Занимательная социология» (200 экземпляров, 143 страницы) в издательстве Соликамского педагогического института в 1997 году и разослал по библиотекам России. Я опубликовал свой учебник «Интересное обществознание» в интернете на второстепенном сайте в 2009 году, а затем опубликовал его на российской Википедии. Сейчас я публикую его на англоязычной Википедии в сокращённом варианте. Я 30 лет пытался устроиться преподавателем социологии в Березниковский филиал Пермского национального исследовательского политехнического университета (БФ ПНИПУ), я принимал участие в конкурсах на занятие этой должности, но мне постоянно отказывали на том основании, что я не имею научной степени кандидата наук. Я был соискателем на степень кандидата наук. Моим научным руководителем сначала была доктор философских наук Баразгова Евгения Станиславовна <ref name="Баразгова 1"/> из Уральского государственного университета имени А. М. Горького (Екатеринбург), затем ныне покойный доктор социологических наук Антипьев Анатолий Григорьевич <ref name="Антипьев 1"/> из Пермского государственного национального исследовательского университета. Я кое-как сдал кандидатский экзамен по философии на 4 балла, потому что кандидат философских наук Савцова Надежда Ивановна <ref name="Савцова 1"/> поставила мне неудовлетворительную отметку за контрольную работу "Типы личности". Тогда я попал в впросак. Я просил её прочитать предварительно мою контрольную работу перед моим выступлением перед аспирантами, но ей было некогда и она предложила мне выступить перед аспирантами на тему "Типы личности". Я начал выступать, намётанным глазом я сразу увидел примеры типов личности среди слушателей и указал аудитории на них. Начало моего выступления вызвало огромный интерес у слушателей, но и крайнее неудовольствие со стороны Савцовой. Она прервала мою речь и не позволила мне говорить дальше. Хотя у меня к тому времени было опубликовано несколько статей в научных сборниках на тему типов личности, тем самым эта моя тема уже прошла экспертизу на научность. Контрольную работу мне пришлось переписать на другую более солидную тему "Механизм религиозного контроля". Итого, за контрольную работу я получил только удовлетворительную отметку и с ней пошёл на экзамен по философии. Экзаменующими преподавателями были мои друзья - доктор философских наук Звиревич Витольд Титович и доктор философских наук Анкин Дмитрий Владимирович <ref name="Анкин 1"/>, с Анкиным мы учились в университете в одной группе и он стал учеником и последователем Лобовикова. Быть может мне тоже нужно было стать последователем Звиревича или Лобовикова, но это не сложилось, эти учёные были мне глубоко симпатичны как люди, но наши научные интересы разошлись, так бывает, каждый крупный учёный идёт своей колеёй. Я испытывал интерес к западной социологии, Звиревич занимался историей философии, Лобовиков - математической логикой. Мне попался на кандидатском экзамене по философии билет на тему "Позитивизм", я ответил по билету на отлично, но с учётом удовлетворительной отметки за контрольную работу, я в итоге получил отметку "хорошо" за экзамен по философии. От Баразговой я ушёл по той причине, что я посчитал. что она имеет низкую научную квалификацию, особенно по сравнению с Ушаковым Валерием Михайловичем. Я хотел видеть своим научным руководителем Ушакова, но он уже уволился из университета в 1998 году. Поэтому я перевёлся в Пермь к Антипьеву. Я целый год ходил на кандидатские курсы по английскому языку, которые вела Любовь Петровна Ракк и сдал этот кандидатский экзамен на 4 балла, экзаменующий преподаватель из Перми отметила, что я отлично перевожу тексты, но она плохо понимает то, что я говорю по английски из-за моего плохого произношения. Это умение переводить тексты очень пригодилось мне в будущем в процессе перевода моего учебника с русского языка на английский. Я целый год писал черновик диссертации в 300 страниц на тему "Отношения конфликта и контроля между различными типами личности". Но тема моей диссертации и стиль моего изложения категорически не устроила моего научного руководителя Антипьева, он предложил мне сменить тему на более заумную и изменить стиль изложения на академический, "кондовый". Я отказался от этого предложения из принципа, мне противно заниматься схоластическими исследованиями даже ради личной научной карьеры, поэтому мне пришлось уйти из соискателей, я отдал черновик своей диссертации грызущей критике мышей по словам Маркса, но я опубликовал идеи из черновика своей диссертации в своём учебнике. Хотя этот отказ похоронил мою научную карьеру и карьеру, как преподавателя университета. Я понял, что мне нужно подобрать кандидатуру научного руководителя к готовой теме и тексту свой диссертации, а не наоборот
Второе ядро моего учебника – это моя теория о типах личности. Я начал разрабатывать эту теорию в 1998 году. Я провёл эмпирические исследования типов личности (см. параграф "Система образования") и социометрические исследования (см. параграф "Малые группы") в средней школе, в Березниковском центре занятости населения (см. параграф "Рынок труда и заработная плата"), в женской колонии строгого режима (см. параграф "Мишель Фуко о тюремной реформе"). Самым интересным и важным вопросом является выбор профессии (см. параграф "Способности человека. Выбор профессии и подбор персонала"), социального лифта (см. параграф "Социальная мобильность") и выбор супруга (см. параграф "Семья")на основе типа личности. Именно изложение теории о типах личности позволяет сделать мой учебник интересным.
Я отработал постоянно и по совместительству 25 лет киномехаником, поэтому я с большим знанием техники написал параграф о кино. Для тех читателей, которым лень читать мои параграфы, я разместил видеоролики в начале почти каждого параграфа. Я 20 лет занимался рекламой художественных фильмов, а теперь рекламирую свой учебник с помощью рекламных роликов. Я много лет демонстрировал чужие фильмы, а сегодня я снимаю документальные фильмы, где являюсь единственным актёром.
Таким образом, кроме изложения первоисточников у меня есть в учебнике 2 оригинальных теории - теория взаимосвязи между конфликтом и контролем и теория о типах личности. По мнению некоторых патрулирующих на Викиучебнике 2 оригинальных теории - это слишком много. Но то, что не позволено рядовому автору на Википедии, то позволено автору учебника на Викиучебнике. У меня удалили около 50 статей на Википедии только за то, что я сам пытался излагать первоисточники и не хотел списывать это изложение первоисточников из толстых журналов, потому что, по моему мнению, моё изложение первоисточников лучше, чем у других авторов из толстых журналов. По существу, я стал соавтором этих классиков социологии и сумел лаконично и интересно изложить их главные идеи в своём учебнике. Доходило до смешного, когда патрулирующие удалили у меня статью "Футурошок" на русскоязычной Википедии и оставили эту статью "Future Shock" на англоязычной Википедии, хотя наши российские авторы преклоняются перед англоязычной Википедией, они только и умеют, что переводить и списывать из англоязычной Википедии. Я даже не пытался излагать свои оригинальные теории на Википедии, потому что на Википедии это категорически запрещено правилами. Сначала сумей опубликовать свои оригинальные теории в толстых социологических журналах, а только потом размещай их на Википедии - так говорили мне патрулирующие на Википедии. В этих толстых журналах публикуют только философскую схоластику и мне туда дорога закрыта. Эти старые лгуны-коммунисты на одном из исторических форумов проголосовали отправить мой учебник "Фтопку" через "ф" и что мой учебник - "Отстой", а я отправил свой учебник на русскоязычную и англоязычную Википедию и имею там много посещений, поэтому я никогда не сумею договориться с этими "товарищами"<ref name="Фтопку" />. На Википедии запрещено писать "По мнению Валерия Старикова". Мне это всё надоело, мне надоело быть на Википедии никому не известным редактором, который умеет только списывать и не имеет собственных оригинальных идей. Я сначала спорил с патрулирующими на Википедии, а потом просто ушёл на Викиучебник и там опубликовал всё, что хотел и как хотел - свой оригинальный учебник, 2 своих оригинальных теории, свою точку зрения и критику всех классических теорий в социологии, в том числе марксизма, своё изложение первоисточников. «Что дозволено Юпитеру, не дозволено быку». Я получил приз на Российской Википедии в 2015 году за наибольшее количество правок в своём учебнике. <ref name="Приз 1" />. Просто я поднимался постепенно с этажа на этаж на сайте Wikimedia по принципу Чичикова: "Зацепил, поволок, сорвалось, не спрашивай" - сначала я разместил статьи на российской Википедии, затем - статьи на англоязычной Википедии, затем - учебник на российском Викиучебнике, а затем - учебник на англоязычном Wikibooks, ты поднимаешься на новый этаж и пробуешь разместить свой текст на удачу и если его не удаляют, то ты поднимаешься на следующей этаж и опять всё получается удачно, так и добираешься до вершины, напевая песню Владимира Высоцкого: "Весь мир на ладони, ты счастлив и нем". С Википедией у меня получилось по другому: зацепил, закрутилось и понеслось до самой вершины. Я разместил свой учебник на самом лучшем сайте "Викиучебник" и пусть люди сравнивают мой учебник с государственным учебником, пусть почувствуют разницу. И чем дольше учителя преподают по другим государственным учебникам, тем больше чиновники из министерства образования злят учеников и учителей. Сегодня патрулирующие на Викиучебнике и на Wikibooks охраняют текст моего учебника от вандалов, эти вандалы пытаются делать правки в моём учебнике и испортить мой текст, а патрулирующие на следующий день удаляют эти правки. Только мне позволено делать правки в моём учебнике, а другие авторы имеют право исправлять только знаки препинания в тексте моего учебника или попробовать написать свой учебник. В процессе создания этого учебника мне пришлось сотрудничать, спорить, учиться у многих известных учёных. Они подвергали рецензированию отдельные параграфы из моего учебника или весь учебник целиком. Поэтому мой учебник проверен на научность многими известными учёными.
Если обобщить научный вклад и перечислить моих рецензентов, соавторов, научных руководителей и оппонентов в дискуссиях, то можно сказать следующее:
* '''Лейбович Олег Леонидович''' - это рецензент всего учебника <ref name="Star 1" />, кроме глав по экономике, праву и параграфов о типах личности.
* '''Липсиц Игорь Владимирович''' - это соавтор главы по экономике.
* '''Узлов Николай Дмитриевич''' - это рецензент параграфа "Теория К. Г. Юнга о типах личности" <ref name="Star 2" />.
* '''Ушаков Валерий Михайлович''' - это соавтор и вдохновитель параграфов "Развитие академической социологии в 19-20 вв.", "Социальная структура", "Влияние географической среды на общество", "Аграрное, индустриальное и постиндустриальное общество", "Социология революции и теория социальной мобильности Питирима Сорокина", вопроса "Причины самоубийств по теории Эмиля Дюркгейма" в параграфе "Девиантное (отклоняющееся) поведение", вопроса "Макс Вебер о протестантской этике и духе капитализма" в параграфе "Механизм религиозного контроля".
* '''Колосницын Всеволод Иванович''' - это научный руководитель параграфа "Механизм религиозного контроля" <ref name="Star 20" />.
* '''Звиревич Витольд Титович''' - это научный руководитель и вдохновитель параграфов "Древнегреческая философия", "Этические учения" и особенно вопроса о поисках первоосновы в древнегреческой физике.
* '''Профессор Матвеев''' - это соавтор вопроса "Гипноз" в параграфе "Личность. Теория З. Фрейда о взаимодействии сознательного и бессознательного".
* '''Захаров Юрий Романович и Бакулин Владимир Иванович''' - это оппоненты в дискуссии о марксизме и коммунизме, см. параграфы "Прогрессивное развитие социальной системы. Формации", "Критика тоталитаризма в работах Поппера и Арона. Прогнозы Маркса и результаты коммунистического эксперимента". Эти оппоненты невольно помогли отточить мои аргументы против марксизма и коммунизма. '''Захаров Юрий Романович''' - рецензент параграфа "Формы правления" <ref name="Star 8" />, параграфа "Социология революции П. Сорокина" <ref name="Star 9" /> и вопроса "Закон вызова и ответа А Тойнби" <ref name="Star 9" /> из параграфа "Цивилизации".
* '''Беккер Вячеслав Филиппович''' - это рецензент параграфа "Искусство" <ref name="Star 12" />, параграфа "Сущность тоталитаризма" <ref name="Star 19" />, параграфа "Наука" <ref name="Star 6" />, вопроса "Причины преступности"<ref name="Star 7" />, в параграфе "Уголовное право", вопроса "Эмпирическое исследование причин преступности"<ref name="Star 7" /> в параграфе "Мишель Фуко о тюремной реформе", вопроса "Социология гениальной личности"<ref name="Star 11" /> в параграфе "Наука", вопроса "Склонности типов личности в политике"<ref name="Star 16" /> в параграфе "Политическая элита, политическое лидерство и политический статус личности", вопроса "Спорные вопросы в конфликтологии"<ref name="Star 21" /> в параграфе "Социальный статус и социальная роль. Социальный конфликт и социальный контроль", вопроса "Выбор лифтов вертикальной мобильности для различных типов личности" <ref name="Star 22" /> в параграфе "Социальная мобильность", вопроса "Педагогика конфликта против утопии Антона Семёновича Макаренко"<ref name="Star 23" /> в параграфе "Система образования".
* '''Шилов Владимир Викторович''' - рецензент вопросов о формациях <ref name="Star 17" /> и "Азиатская формация" <ref name="Star 3" /> в параграфе "Прогрессивное развитие социальной системы. Формации", вопроса о теории взаимосвязи между социальном конфликте и социальном контроле в параграфе "Социальный статус и социальная роль. Социальный конфликт и социальный контроль" вопроса "Конфликт школьных клик"<ref name="Star 18" /> в параграфе "Малые группы", вопроса "Роковая любовь"<ref name="Star 10" /> в параграфе "Любовь и дружба как виды межличностных отношений", вопроса "Стиль преподавания у разных типов личности педагогов" <ref name="Star 13" /> в параграфе "Система образования", вопроса "Список рекомендуемых профессий для разных типов личности, который нужно учитывать при выборе профессии и подборе персонала."<ref name="Star 14" /> и вопроса "Степень пригодности на роль руководителя и стиль управления коллективом у различных типов личности"<ref name="Star 15" /> в параграфе "Способности человека. Выбор профессии и подбор персонала".
* '''Антипьев Анатолий Григорьевич''' - рецензент вопроса "Эмпирическое исследование причин безработицы" <ref name="Star 4" />в параграфе "Рынок труда и заработная плата", вопросов "Школьная реформа в Британии и России" "Рынок образовательных услуг" <ref name="Star 5" /> в параграфе "Система образования".
Я выражаю глубокую благодарность всем этим моим преподавателям, рецензентам, соавторам, научным руководителям и оппонентам в дискуссиях за вклад в мою работу. Мы стоим на плечах своих учителей.
===О причинах, заставивших меня написать этот учебник===
Михаил Горбачёв начал, но не смог завершить экономические и политические реформы в России до конца. Борис Ельцин ввёл в России великие западные изобретения - рыночную конкуренцию, частную собственность и представительную демократию. Я пишу в своём учебнике, что Россия - это не бензоколонка, это империя с тысячелетней историей, которая шагала по трупам великих империй прошлого - Золотой Орды, Речи Посполитой, Шведской империи Карла XII, Османской империи, Наполеоновской Франции, Гитлеровской Германии, Императорской Японии.
Громадная проблема российского образования — это выпуск учебников по обществознанию, которые не пригодны для преподавания по содержанию и по стилю изложения. Определить степень пригодности учебника для преподавания очень просто - для этого нужно просто попробовать пересказать любой параграф самому, не заглядывая в текст учебника. Если вам, взрослому человеку и учителю, не удалось пересказать параграф из государственного учебника, то как вы можете это требовать от ребёнка? До 1991 года в СССР преподавали обществознание по лживым марксистским коммунистическим учебникам. С 1991 года по сегодняшний день преподают по непригодным для преподавания учебникам В. И. Купцова, Л. Н. Боголюбова, А.И. Кравченко, П. А Баранова, А. Ф. Никитина, В. А. Никонова, Г. А. Бордовского и др. В этих учебниках нет ни одной цитаты и ни одной ссылки на источники, только по этим формальным основаниям патрулирующие на Википедии удалили бы эти учебники с Википедии через неделю, патрулирующие на Википедии часто не разбираются в социологии, но они могут отличить авторитетный источник от не авторитетного, а если ссылок в учебнике нет, то патрулирующие полностью лишены этих возможностей. В моём учебнике сначала тоже не было ссылок, патрулирующие на российской Википедии указали мне на этот недостаток и я потратил целый год, чтобы разместить ссылки в своём учебнике на самые авторитетные источники - работы классиков социологии и учебники западных авторов, все эти источники были в моей домашней библиотеке. Мне оказалось несложно найти эти работы на английском языке в англоязычном интернете, чтобы сделать ссылки на них в тексте моего англоязычного учебника. Естественно, что авторы других учебников по обществознанию не смогут найти свои неавторитетные лженаучные русскоязычные источники в англоязычном интернете и сделать там ссылки. В Америке есть отличные учебники по социологии, психологии, экономике, которые я использовал при написании своего учебника, но в Америке нет учебника, который бы изложил основы всех 14 наук, которые входят в состав обществознания. В американских учебниках по социологии таких авторов, как Нил Смелзер <ref name="Смелзер 1" /> и Джон Масионис <ref name="Масионис 1" />главное понятие - это мутное схоластическое понятие "культура", а у меня главное понятие - это два ясных понятия "социальный конфликт" и "социальный контроль". В общественных науках существует несколько десятков определений понятий "культура", поэтому никто не знает, что это такое. В американских учебниках по психологии излагают ложные теории Маерс-Бриггс и Кейрси о типах личности, а я излагаю в своём учебнике собственную истинную теорию о 4-х типах личности. Типологии Катрин Бриггс, Изабель Мэерс, Дэвида Кейрси и соционика Аушры Аугустинавичуте напоминает искусственную теоретическую конструкцию, так как 16 типов - это слишком много для визуального тестирования. Типы личности Катрин Бриггс и Изабель Мэерс не существует в природе, таким образом эти люди исследуют то, что существует только в их головах. Типологии моих конкурентов - это бред и лженаука. Если ваши деньги потрачены для использования их типологии для профессиональной ориентации, то эти деньги потрачены впустую. Преимущество моей типологии состоит в том, что в моей типологии существует визуальный тест в отличие от типологий моих конкурентов. Мои конкуренты не могут создать визуальный тест в принципе, так как слишком много типов личности (16 типов личности) существует в их типологиях по сравнению с моей типологией (4 типа личности). Мои конкуренты не могут перепроверить результаты своего словесного теста с помощью визуального теста, а я могу перепроверить результаты своего словесного теста с помощью визуального теста даже тогда, когда респондент сознательно врёт на словесном тесте или не понимает вопросов словесного теста, потому что опознавательные знаки на лице респондента никогда не лгут. По моему мнению тип личности написан на лице, буквально на лбу у каждого человека. Я могу научить любого человека в течение нескольких занятий видеть этот тип личности на лицах окружающих людей по опознавательным знакам. Поэтому мой учебник вызвал большой интерес на Западе и американцам есть чему у меня поучиться.
Сегодня многие учителя просто отказываются преподавать обществознание по государственному, но непригодному для преподавания учебнику, а ученики протестуют и срывают уроки по обществознанию. Отсутствие пригодного учебника и высокие требования к учителю по результатам ЕГЭ поставили школьного учителя в сложное, даже безвыходное положение. Три десятилетия школьные учителя по обществознанию делали вид, что чему-то учат, а ученики протестовали или делали вид, что чему-то научились. Этому всеобщему обману сегодня положен конец. Сегодня с помощью тестов ЕГЭ министерство образования требует показать результаты обучения по обществознанию. Хотя подготовить учеников к тестам ЕГЭ даже по непригодному для преподавания учебнику - это не сложно, для этого нужно просто взять прошлогодние тесты с правильными ответами и "натаскать" учеников в надежде, что в этом учебном году тесты будут подобными прошлогодним тестам. Когда я составлял свой учебник, то я ориентировался прежде всего на работы классиков социологии и реакцию учеников на мои лекции, на степень интереса к моим лекциям, на возможность учеников легко пересказать мои лекции. Если я не смог найти работу классиков социологии на какой-то вопрос стандартов, то тем хуже для этих стандартов, я просто пропускал в своём учебнике этот вопрос, потому что этот вопрос - это научная галиматья и абракадабра. Если ученики не слушают или не понимают этот вопрос, то я исключил этот вопрос из своего учебника. Я гарантирую, что тесты ЕГЭ, составленные по моему учебнику, будут ясными и будут предполагать однозначный ответ как в тестах по математике 2+2=4. Не будет того позора, когда на вопрос теста по обществознанию можно дать несколько правильных ответов из предложенных для выбора. Не будет того позора, когда ученики выигрывают суды у министерства образования по поводу ответов на вопросы ЕГЭ. Я гарантирую, что учителя будут получать удовольствие от преподавания обществознания по моему учебнику и будут иметь самые высокие рейтинги в школе. Я гарантирую, что ученики будут легко пересказывать параграфы из моего учебника, ученики будут испытывать огромный интерес к предмету обществознание и будут легко сдавать экзамены в любой форме по обществознанию, хотя мой учебник содержит гораздо больше информации, чем другие государственные учебники, потому что я собрал эту информацию из работ лучших классиков философии, социологии и политологии. Работы этих классиков социологии написаны в течение последних 2,5 тысяч лет.
Есть государственная программа по обществознанию. Я подобрал авторов, чьи работы отвечают на вопросы этой программы. Эти авторы - это классики западной философии, социологии, политологии и психологии, а не наши отечественные лже-учёные. С классиками социологии спорят только дураки. Поэтому очень трудно что-то возразить против моего учебника. Работы этих классиков социологии связаны между собой с помощью моей теорией взаимосвязи между конфликтом и контролем. Именно на основе своей теории я делаю выводы, указываю на ошибки и гениальные идеи каждого классика социологии. Я сам излагаю теории этих классиков социологии, а не списываю это изложение у других российских авторов, потому что я считаю своё изложение теорий классиков социологии самым лучшим. Из политологов я больше всего ценю Никколо Макиавелли за трезвый взгляд на политику в работе "Государь", за скептицизм и изрядную долю цинизма. Я ценю совет Остапа Бендера из романа Ильи Ильфа и Евгения Петрова "12 стульев": "Киса, побольше цинизма, людям это нравится". Нужно смотреть на общество трезво и объективно без всяких социальных утопий. Я обращаюсь с классиками социологии без всякого пиетета и священного трепета, я даже выставил отметки этим классикам социологии и оценил степень их гениальности или глупости, например, Аристотелю я поставил две отличных отметки за изобретение двух наук - формальной логики и политологии, а Платону я поставил неудовлетворительную отметку, потому что Платон не изобрёл ничего ценного в общественных науках, кроме бесполезной утопии. Я очень ценю работу Диогена Лаэртского "О жизни, учениях и изречениях знаменитых философов" за юмор и сарказм в описании биографий древнегреческих философов и я взял этот саркастический стиль сочинений за образец. Для меня классики социологии - это просто соавторы, иногда из их мутных неудобоваримых и многословный теорий, я сделал "конфетку", за что они должны быть мне благодарны, здесь я имею в виду работу Арнольда Тойнби "Постижение истории"(около 1000 страниц), из которой я сделал вопрос "Закон вызова и ответа" (1 страница) в параграфе "Цивилизации". Из учёных в области естественных наук я больше всего ценю Георгия Антоновича Гамова (Теория горячей Вселенной) и Чарльза Дарвина (теория биологической эволюции). Свою теорию социального прогресса я считаю продолжением их теорий прогресса в физическом мире и биосфере.
Сегодня наша страна учится у Запада во всех областях, в том числе и в научной области. Советские общественные науки семьдесят лет находились в изоляции от развития мировой науки, что привело к появлению различных лженаук. В качестве примера этих лженаук можно указать на ленинскую теорию отражения, марксистскую диалектику, деятельностный подход, марксистскую этику и эстетику, диалектический и исторический материализм, марксистскую гносеологию, научный коммунизм. Без преувеличения можно сказать, что, за немногим исключением, все советские общественные науки, построенные на фундаменте марксизма-ленинизма, были суммой лженаук. Нужно выбросить этот старый и бесполезный хлам из российской науки на свалку истории. По моему мнению, теорию Маркса следует отправить в архив научных заблуждений и вредных социальных утопий, хотя отдельные идеи Маркса сохранили свою научную ценность, например, теория об общественно-экономических формациях. Марксистско-ленинская философия, это грандиозное сооружение, после крушения советской системы лопнуло как мыльный пузырь и разлетелось вдребезги. Поэтому в моём учебнике нужно сделать упор не на изложение современной российской философии, а на изложение истории философии, пусть меняются стандарты и учебники, но история философии — это золотой фонд, который сохраняет свою ценность при всех катаклизмах истории. Социолог П. А. Сорокин, физик Г. А. Гамов и многие другие великие русские учёные были вынуждены уехать из России под угрозой расстрела и полжизни прожить на Западе. А те, кто остались в России, подвергались травле и тюремному заключению, как историк Л. Н. Гумилёв и генетик Н. И. Вавилов. Именно такие лжеучёные, как Т. Д. Лысенко подвергали их травле. Лысенко, в частности, отрицал существование генов, как носителей наследственности, и сделал ложный прогноз, что рожь может порождаться пшеницей и наоборот, он обещал вывести ветвистую пшеницу. Лысенко голословно обвинял своих оппонентов в поддержке расизма и евгеники. Лысенко не имел серьёзного научного образования и присвоил себе титул «народного академика».
Россия не только учится у Запада, но и сегодня вступила в геополитическое противостояние с Западом, опираясь на результаты экономических реформ, проведённых по западным образцам. Россия стремится вернуть свою сферу влияния, потерянную вместе с распадом СССР в 1991 году. Это привело к началу Специальной военной операции на Украине в 2022 г. Сегодня эта тема является самой интересной для читателей во всём мире. Пока не создано большого числа обобщающих научных работ по этому вопросу Если и есть такие работы, то они зачастую являются лживыми или быстро устаревающими. Вторая трудность в том, что специальная военная операция на Украине ещё не закончена, поэтому ещё не ясно, какие будут результаты этой операции и чья будет победа.Эта война, которая впервые широко освещается в прессе, на телевидении и в интернете, историку не нужно сидеть в архиве и изучать архивные документы. В интернете есть много информации о этой войне. Главная задача историка - выбрать самое главное из огромного массива разноречивой информации, описать новые виды оружия, описать новую тактику применения войск. Описать современную войну на Украине - это трудная задача, я стараюсь решить эту задачу так, как умею.Что из этого получится - увидим. Сумею решить эту проблему - стану классиком по вопросу этой войны, у которого другие историки будут списывать информацию об этой войне, а ученики и студенты будут изучать историю этой войны по параграфу из моего учебника. Писать параграфы по истории - это легче, чем параграфы по социологии. В социологии ты описываешь какие-то теории, а в истории ты описываешь наблюдения за ходом событий, в истории ты пишешь сказки вместо теории.
На Западе О. Конт совершил переворот в философии и основал новую позитивную науку — социологию. Конт назвал критерии, которые отличают науку от лженауки. Эти критерии состоят в следующем. Наука должна опираться на опыт и эксперимент, наука должна давать прогнозы и результаты. Соответственно лженаука не опирается на опыт, она опирается на одни умозрительные рассуждения. Лженаука не даёт прогнозов или даёт неверные прогнозы.
Если человек не может формулировать оригинальные теории в науке, то ему нет смысла заниматься наукой. Чтобы замаскировать отсутствие ценной научной информации и оригинальных идей современные российские лжеучёные используют академический казённый «кондовый» стиль сочинений в надежде, что ни один читатель не сможет понять и дочитать до конца их научную работу по принципу: чем непонятнее, тем мудрее выглядит. Такой стиль служит средством маскировки своей глупости и способом пустить пыль в глаза. Эти лжеучёные привыкли писать свои научные диссертации и учебники, используя внешне наукообразные, но на самом деле бессмысленные фразы по типу "С точки зрения банальной эрудиции...". Они пытаются «грузить» учащихся псевдонаучной схоластикой. Такой стиль изложения тем более недопустим при публикации школьного учебника. Школьников отпугивает академический стиль изложения. Один учитель мне признался, что его ученики близки к состоянию бунта в процессе преподавания по подобным школьным учебникам по обществознанию. Стиль изложения должен быть популярным, лаконичным и занимательным. В детском учебнике нужно не пыль в глаза пускать, а излагать связные рассказы "the story", рассказывать "сказки", которые ученик может легко пересказать и запомнить, нужно вызвать интерес у школьников, нужно для этого использовать работы классиков западной социологии, а не работы российских лжеучёных. Текст учебника должен содержать много полезной для жизни информации и поменьше схоластических рассуждений. С другой стороны, автор учебника, должен обладать высоким теоретическим уровнем. Школьный учебник должен содержать серьёзную научную информацию, изложенную в популярной форме. Некоторые преподаватели сегодня впали в другую крайность — в религиозное мракобесие и мистику. Гороскопы, теория о реинкарнации (о переселении душ), происхождение человека от Адама и Евы, жизнь после смерти, сотворение мира богом за семь дней — эти теории тоже являются разновидностями лженауки, и их можно использовать в преподавании только ради шутки в качестве иллюстрации человеческой глупости. Реформа в образовании выдвигает новые требования к содержанию учебников. Нужно найти отечественных авторов, способных написать учебники по западным стандартам или просто перевести на русский язык и учить по апробированным западным учебникам. Но похоже, что на Западе есть только учебники по отдельным дисциплинам из области обществознания - по социологии, политологии, философии, экономике, но нет учебников по обществознанию в целом. Так что на Западе тоже есть чему у нас поучиться.
'''В чём состоят причины неудач других авторов при попытках написать учебник по обществознанию? По моему мнению, эти причины состоят в следующем.
'''
* '''Сам предмет изложения является слишком широким по содержанию и трудно найти такого автора, который обладает универсальными знаниями по всем общественным наукам.''' Трудно найти автора, который способен квалифицированно изложить в учебнике содержание четырнадцати наук — социологии, политологии, формальной логики, теории познания, философии, психологии, религиоведения, этики, педагогики, антропологии, культурологии, экологии, права и экономики, которые входят в курс обществознания. Кстати, именно в такой последовательности располагаются эти науки в списке моих научных интересов, то есть наибольший интерес представляет для меня социология, а наименьший — экономика. Поэтому глава по экономике подготовлена мной на основе учебника И. В. Липсица «Экономика» <ref name="Lipsic 1" />. и отредактирована этим автором. Именно социология лежит в основании моего учебного пособия, а в социологии и психологии наибольшее значение, по моему мнению, имеют три понятия — ''социальный конфликт'', ''социальный контроль'' и ''типы личности''. Принципы социального конфликта и контроля позволяют рассматривать общество с точки зрения макросоциологии, а принцип типов личности — с точки зрения микросоциологии, таким образом, рассмотрение общества становится многогранным. Эти три понятия позволяют решить многие спорные проблемы в обществознании: о причинах социального неравенства, причинах преступности, критериях для классификации формаций, форм правления и политических режимов, причинах вырождения и гибели цивилизаций, причинах социального прогресса и причинах крушения социалистической системы. В моём учебнике общество рассматривается как развивающаяся открытая система, которая в своей истории прошла через четыре ступени развития — четыре формации — первобытную, рабовладельческую, феодальную и капиталистическую. Особое внимание в данном учебнике уделено различным социальным изобретениям. Таким образом, я попытался поднять на щит несколько подзабытую идею социального прогресса. Изучение спорных вопросов в обществознании повышает у учащихся интерес к предмету. Я строил свой учебник как лоскутное одеяло, когда по каждому вопросу стандартов я постарался найти классическую, чаще всего западную теорию и кратко её изложить. Эти лоскуты я постарался сшить в единое целое с помощью принципов социального конфликта, социального контроля и типов личности. В знак уважения к авторам социологических теорий, к этим научным гениям, я изложил их биографии. В данном учебнике приведены 8 таблиц, 4 словаря (словарь терминов, именной указатель, список сокращений, список использованной и рекомендуемой к самостоятельному прочтению литературы). Классики науки, в отличие от посредственных авторов современных учебников, умели излагать содержание своих теорий ясно и лаконично. Их теории прошли испытание временем и вошли в мировой золотой фонд гениальных идей. Автор учебника должен уметь «раскладывать информацию по полочкам», чтобы школьник мог её запомнить и пересказать без особого напряжения. Способность ученика легко пересказать текст учебника и есть главный показатель пригодности учебника для преподавания. Я преподавал по своему учебнику в школе 13 лет и могу ручаться, что данный учебник пригоден для преподавания. Учебник должен содержать яркую и интересную информацию — склонности различных типов личности, язык жестов, причины преступности, тему о «роковой» любви и биографии философов. При изложении права нельзя обойтись без примеров преступлений, но нужно брать эти примеры из реальной жизни, а не придумывать и «не высасывать из пальца». Жизнь бывает гораздо интересней наших фантазий. Изложение биографий мыслителей необходимо по той причине, что их идеи часто служат обобщением опыта их жизни, их жизненные проблемы служат иллюстрациями, примерами проявления их идей. Изложение биографий мыслителей имеет большое воспитательное значение, так как демонстрирует их целеустремлённость и преданность науке. Нужно излагать биографии только тех авторов, которые внесли существенный вклад в развитие науки.
* '''Не всякий университетский преподаватель способен овладеть популярным стилем сочинений, необходимым для написания школьного учебника.''' Нельзя забывать о том, что учебник написан именно для детей, которые имеют свой уровень восприятия. Сегодня ни один ученик не может пересказать своими словами и запомнить ни один параграф из государственных учебников. Это произошло потому, что авторы государственных учебников сами лично не преподавали в средней школе по своему учебнику. Сначала они писали фальшивые диссертации, а теперь пишут фальшивые неудобоваримые учебники. Российские общественные науки напоминают "агниевы конюшни", которые необходимо вычистить от схоластики по примеру Геракла, для этого я обратился к первоисточникам и западным учебникам. Авторы других учебников часто даже не делают ссылок на использованную литературу. У меня в российском варианте учебника 100 параграфов, в каждом параграфе есть до 100 ссылок. В моем англоязычном учебнике я тоже сделал очень много ссылок на англоязычные источники. У меня в англоязычном учебнике 37 параграфов, в каждом параграфе есть до 48 ссылок, просто потому что мой учебник построен на изложении идей классиков социологии и на западных учебниках. Работы этих классиков социологии и западные учебники существуют как на русском, так и на английском языке. Видимо, другие авторы учебников используют российские источники, а я использую западные первоисточники, написанные классиками философии и социологии и западные учебники. Таким образом, мои источники являются более авторитетными по правилам Википедии. В моём учебнике информация представлена лаконично, иногда даже в форме тезисов. При изложении истории философии акцент сделан на изложении истории именно западной философии. История российской социологии в данном учебнике ограничивается подробным изложением только социологических теорий Н. Бердяева, П. А. Сорокина, В. О. Ключевского, В. И. Ленина, Л. Н. Гумилёва и физической теории Г. А. Гамова. Некоторые из этих авторов были вынуждены эмигрировать на Запад, где их теории получили признание. Изложение сущности теорий в области академической социологии представляет, на мой взгляд, самую интересную часть истории обществознания. Одной из целей моей работы является научное опровержение и критика нацизма и национализма. Нацисты имели правдоподобное псевдонаучное обоснование своих идей в форме социал-дарвинизма. Во второй мировой войне нацизм был разгромлен на поле боя. Сегодня наибольшую опасность представляет собой не германский национализм, а его противоположность — национализм южных наций. Идеи национализма эксплуатируют национальные и расовые предрассудки. Эта цель особенно актуальна в связи с возрождением нацизма даже в нашей стране в форме чеченского национализма, деятельности партии Русского национального единства и движения «бритоголовых», которые устраивают погромы на рынках и убивают «южан». Не следует забывать, что любая великая теория, даже теория Маркса и социал-дарвинизм, содержит и отдельные крупицы истины, и серьёзные ошибки. Учёт этого обстоятельства делает научную критику этих теорий взвешенной. Много внимания в данном учебнике будет уделено тем теориям, которые при советской власти были запрещены цензурой к публикации или к преподаванию, например, такие теории, как концепции об азиатской формации, социал-дарвинизм и нацизм, теории Ницше, Фрейда, Гумилёва, Арона, Поппера, Сорокина. Мой опыт преподавания показывает, что именно ранее запретные темы вызывают наибольший интерес учащихся. Сегодня нельзя замалчивать и обходить стороной эти темы по той причине, что учащиеся при желании всё равно смогут найти информацию об этих теориях из каких-то других источников, например, из интернета. Нужно вооружить учащихся знанием ошибок и достоинств этих теорий.
* '''Информация в учебнике должна быть полезной для школьника,''' должна готовить его к решению проблем самостоятельной жизни — к выбору профессии и супруга, выбору лифта социальной мобильности в процессе построения своей персональной карьеры. Учебник должен помочь избавиться от комплекса неполноценности. Ученик должен знать свои склонности и способности, сильные и слабые черты характера. Чтобы научить школьника разбираться в людях, в учебнике приведены не схоластические рассуждения, а различные классификации людей — по типу личности, темпераменту, порядку рождения, типу телосложения, наличию или отсутствию лидерских качеств. Нужно научить учащегося понимать язык жестов, то есть понимать характер межличностных отношений, видеть, когда ваш собеседник лжёт, заигрывает или угрожает. Это умение полезно в бизнесе, процессе преподавания, любви и других сферах жизни. Нужно научить учащегося выбирать и строить свой имидж на службе. Учебник должен рассказать школьнику об устройстве современного общества, в котором ему предстоит найти своё место. Поэтому в учебнике приведено описание постиндустриального общества, демографических, глобальных и экологических проблем. Нынешнему поколению школьников предстоит жить в этом обществе и решать эти проблемы. Наше общество построено, главным образом, на отношениях социального конфликта и социального контроля между людьми. Нужно научить учащегося поддерживать эти отношения, научить конкурировать, контролировать и подчиняться, выживать и бороться за «место под солнцем», бороться за высокий статус и хорошо играть свою роль, преодолевать ролевой конфликт в свой душе, когда требования одной роли противоречат требованиям другой роли. Нужно познакомить учащихся с устройством малых групп и организаций, в которых им в будущем предстоит жить и работать. Примерами малых групп служит семья, группа друзей, бюрократическая клика. Примерами организаций служит харизматическая секта, тотальная организация, бюрократия. Нужно предостеречь учащихся от вступления и участия в таких опасных группах, как харизматическая секта или толпа. Нужно предостеречь учащихся от девиантного поведения (от наркомании, алкоголизма, преступности и самоубийства) и от опасности стать жертвой роковой любви. Нужно научить учащихся к выживанию в армейской казарме и других тотальных организациях. В учебнике подробно описаны воровские профессии с той целью, чтобы граждане были осторожными, бдительными и не стали лёгкой добычей для преступников. Много места — четыре параграфа — уделено изложению темы политических режимов и критике тоталитаризма. Это сделано по той причине, что именно в России был изобретён тоталитаризм, и именно Россия больше других стран пострадала от него в 20 веке. Нужно постараться, чтобы в России больше никогда не был установлен тоталитарный режим. Для этого нужно объяснить учащимся, что тоталитаризм — это наихудший вид политического режима. Очень много места — шесть параграфов и три приложения к параграфам — уделено изложению содержания уголовного, уголовно-процессуального, уголовно-исполнительного кодексов и уголовной ответственности, так как, во-первых, именно уголовное право имеет самое большое значение в жизни простых людей, во-вторых, нужно научить учащегося защищать свои права через суд, а не только говорить на уроках об этих правах.
* '''Нужно подвергнуть критике различные утопические и мистические теории как псевдонаучные и вредные для подрастающего поколения'''. По теории Дарвина, человек произошёл от обезьяны, а не от инопланетян и не от Адама и Евы. Нужно показать процесс перехода от обезьяны к человеку. По теории Фрейда, сознание — это только верхушка айсберга, под которой скрывается огромная подводная часть — бессознательное, которое напоминает котёл. Этот котёл вырабатывает много энергии, которая требует выхода. Нужно подвергнуть критике диалектику Гегеля, коммунистическую теорию Маркса и Энгельса. Применение этих теорий на практике привело к огромным жертвам среди населения нашей страны в результате гражданской войны, террора властей против собственного народа, голода, коллективизации и некомпетентного руководства Красной армией в начале Второй мировой войны. По существу, теории Гегеля и Маркса не заслуживают того, чтобы тратить время на их изучение в данном учебнике, и только высокая цена, которую заплатила наша страна за экспериментальную проверку прогнозов теории Маркса, заставляет меня подробно остановиться на изложении этих теорий, с целью указать на ошибки этих теоретиков. Нужно подвергнуть критике утопические марксистские прогнозы о равенстве между людьми при коммунизме, нужно показать, что общество всегда будет построено на экономическом неравенстве между людьми. Это неравенство является следствием того, что общество построено на отношениях конфликта и контроля между людьми, где богатство, престиж и власть — это приз победителю в конфликте и средство для применения санкций контролёром по отношению к объекту контроля. Как показал опыт политики «военного коммунизма» в России, уравниловка в доходах приводит к исчезновению стимулов к труду и к экономической разрухе. Много места в учебнике было уделено проблеме изложению содержания работ Поппера и Арона. Это объясняется тем, что именно они первыми выдвинули те идеи, которые сегодня стали основой для либерального осмысления сущности советского режима и марксизма. Нужно учить школьников трезво смотреть на жизнь, не верить в утопические проекты и фарисейские проповеди, не ждать пособий от государства, а делать свою личную карьеру, подниматься по ступеням социальной стратификации, добиваться богатства, престижа и власти, но делать это в рамках соблюдения законности. Современная школа должна воспитывать индивидуалистов, рассчитывающих только на свои собственные силы и собственную предприимчивость, а не коллективистов, рассчитывающих на пособия и помощь со стороны государства. В этом состоит сущность моей этики конфликта. Государство должно поддерживать оптимальный уровень степени неравенства, так как слишком большая степень неравенства приводит к гражданской войне, а слишком малая степень неравенства приводит к снижению стимулов к труду и экономической разрухе. Современное общество построено на равенстве возможностей и неравенстве результатов труда.
* '''Содержание учебника, в целом, должно соответствовать стандартам в образовании''', чтобы учащийся мог успешно сдать выпускные экзамены в форме тестов ЕГЭ по обществознанию. Первое издание данного учебника — Стариков В. В., Горюнов В. И. Занимательная социология. Соликамск 1997 :<ref name="Star 1" /> (смотрите эту работу в интернете на сайтах каталогов Саратовского государственного университета Web ИРБИС64 и Архангельской областной научной библиотеки) — не вполне соответствовало этим стандартам, так как стандарты были изданы несколько позже этого издания. Это несоответствие проявлялось в том, что в первом издании данного учебника отсутствовали вопросы права и экономики. Кроме того, первое издание данного учебника было построено не на последовательном изложении вопросов из программы, а по хронологическому принципу изложения из истории обществознания. Второе издание призвано устранить эти недостатки, хотя много информации было перенесено из первого издания во второе. Первое издание данного учебника напоминало колоду карт (научных тем), которые пришлось разложить в другой последовательности. Мой опыт преподавания с помощью первого издания в средней школе показал, что оно вполне пригодно для преподавания в качестве «хрестоматии», в качестве дополнительного пособия по истории обществознания, что оно вызывает значительный познавательный интерес у школьников. Во второе издание было дополнительно включено содержание новых книг западных авторов и моих статей, опубликованных за последние годы. Многие сведения были почерпнуты мной с помощью Интернета.
* '''Именно советская этика, педагогика и эстетика были и до сих пор являются примерами советских лженаук.''' Советские лжеучёные пытались рассуждать о высоких моральных принципах, изображая из себя воспитателей молодёжи, но они не проводили реальных эмпирических исследований, не выдвигали прогнозов и рекомендаций. Поэтому от этих лженаук не было никакой реальной пользы. Пустые декларации моральных ценностей не приносят никакой пользы. Поэтому я постарался сделать из этого выводы и не заниматься пустым морализаторством, декларацией моральных ценностей, даже в том случае, если этого требуют государственные стандарты в обучении, так как стандарты — это тоже не догма, их тоже время от времени нужно менять. Я постарался излагать культурологию по современным западным образцам. Вместо бесполезного морализаторства я постарался изложить содержание теоретических систем основателей этики — Сократа, Диогена, Аристиппа, Эпикура, Зенона Китийского, Сенеки, Марка Аврелия и Будды. Большинство авторов описывает жизнь основателей этики с пиететом и священным трепетом. Такой стиль для меня совершенно неприемлем. Я буду придерживаться того саркастического стиля, с которым описывал основателей этики Диоген Лаэртский, тот самый античный автор классического учебника по истории греческой философии «О жизни, учениях и изречениях знаменитых философов».<ref name="Diogen 1" /> Значение книги Диогена Лаэртского состоит в том, что эта книга является главным источником информации о жизни и изречениях древнегреческих философов. С точки зрения моей педагогики конфликта, школа должна готовить ученика к трудностям будущей жизни. Если человеческое общество построено на отношениях конфликта и контроля, на расслоении на богатых и бедных, на нанимателей и наёмных работников, то к этому нужно готовить уже в школе. Нужно воспитывать у учащихся готовность к подчинению, когда это нужно, и готовность вступить в конфликт, когда есть шансы на успех в стремлении к власти.
Мой параграф о Специальной военной операции на Украине есть отдельный пример темы глобального соперничества из геополитики в моём параграфе о Влиянии географической среды на общество. Я пишу этот параграф об СВО больше 4 лет и конца этому пока не видно. Но все войны рано или поздно заканчиваются, как и моя работа над этим параграфом. Я получаю огромный объём информации об этой войне из интернета. Я должен из нескольких тысяч статей сделать один параграф. В этом и состоит моя роль и мастерство. Основная проблема - это отбор предоставленной информации. Мой параграф уже распух до 50 страниц за 4 с половиной лет - это слишком много для 1 параграфа в школьном учебнике, Собираюсь сильно сократить свой параграф после окончания войны, потому что большое видится на расстоянии. .
У министерства образования и авторов государственного учебника по обществознанию под редакцией Боголюбова разруха в головах, поэтому вся Россия преподаёт с 1991 года и по сегодняшний день (34 года) по учебнику Боголюбова, не пригодному для преподавания. Ёжики плачут, но едят кактус и преподают по непригодному учебнику. А я, как профессор Преображенский из романа "Собачье сердце", смеюсь над ними и предлагаю им бить себе по голове и выбить оттуда всю разруху, взять мой учебник на Википедии и преподавать оттуда интересные и полезные истины, почерпнутые у классиков западной социологии, а не у доморощенных лжеучёных, которые при советской власти 70 лет изобретали лженауку - марксизм и писали фальшивые диссертации и не пригодные для преподавания учебники, списанные с этих фальшивых диссертаций и лженаучных научных работ.
В приложения к параграфам вынесена информация, которая является трудной для заучивания, например, список налогов, или, наоборот, интересная по содержанию, но выходящая за рамки стандартов, например, информация о преступном мире. В конце почти каждого параграфа приведены вопросы для размышления. Эти вопросы часто являются очень сложными, на некоторые из этих вопросов не существует однозначного ответа, даже в науке эти вопросы иногда являются предметом дискуссий. Тем больше возможностей для учеников проявить свои интеллектуальные способности. При составлении словаря терминов я хотел добиться того, чтобы в определении было не более 5 слов, а ещё лучше — два слова, одно из которых означает перевод первого слова с иностранного языка на русский, хотя мне и не всегда удавалось добиться такого крайнего лаконизма определений. Лаконичные определения облегчают для учащегося их заучивание. Длинное определение часто означает, что автор этого определения сам не может до конца понять сущность определяемого понятия или то, что вокруг способов определения этого понятия в науке идут споры, то есть никто из учёных до конца не знает сущность этого понятия, тогда зачем предлагать учащимся эти определения для заучивания? Нужно учитывать, что излишне строгие преподаватели часто заставляют учащихся заучивать длинные определения наизусть, даже если в этом определении не пять слов, а пять строчек. Кто-то из моих добровольных помощников оформил этот мой словарь терминов в форме книжки и выложил в виде бесплатной пробной версии. Я выражаю им свою благодарность за эту помощь в развитии моего проекта. Пусть читатели почувствуют разницу моего словаря терминов с каким-нибудь другим философским словарём. Мой словарь терминов позволяет ученикам заучивать эти понятия об обществе легко и играючи. В этом словаре терминов содержится вся суть моего учебника.
https://quizlet.com/kr/260607513/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D0%BE%D0%B5-%D0%BE%D0%B1%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%B7%D0%BD%D0%B0%D0%BD%D0%B8%D0%B5-10-11-%D0%BA%D0%BB%D0%B0%D1%81%D1%81-flash-cards/?isSignupSession
Государственная программа курса обществознания в 10–11 классах рассчитана на 102 часа (34 часа в 10 классе и 68 часов в 11 классе).
Валерий Стариков.
{{BookCat}}
== Примечания ==
{{Примечания | refs =
<ref name="Стариков 1" >{{Книга | автор = Valery Starikov | заглавие = Interesting social sciences| место = | год = | издательство = Wikibooks | страницы = https://en.wikibooks.org/wiki/Interesting_social_sciences| isbn = }}</ref>
<ref name="Манифест" >{{Книга | автор = К. Маркс, Ф. Энгельс. | заглавие = Манифест коммунистической партии.| место = | год = | издательство = | страницы = 1. https://socialist.news/assets/pdf/manifest.pdf| isbn = }}</ref>
<ref name="Звиревич 1" >{{Книга | автор = | заглавие = Звиревич Витольд Титович. Известные учёные https://www.famous-scientists.ru/6322/ | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Звиревич" >{{Книга | автор = Звиревич, Витольд Титович. | заглавие = Философия Древнего мира и Средних веков : Учеб. пособие для вузов. | место = М. : Акад. Проект ; Екатеринбург : Деловая кн. | год = 2002. | издательство = | страницы = 346 стр.| isbn = ISBN 5-88687-114-4 }}</ref>
<ref name="Лобовиков 1" >{{Книга | автор = | заглавие = Лобовиков Владимир Олегович. Институт философии и права https://ifp.uran.ru/about/sotr/sotr_15.html | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Колосницын 1" >{{Книга | автор = | заглавие = Колосницын Всеволод Иванович. Департамент искусствоведения, культурологии и дизайна http://art-urgi.urfu.ru/index.php/k/kolosnitsyn-vsevolod-ivanovich.html | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Колосницын 2" >{{Книга | автор = Колосницын Всеволод Иванович. | заглавие = Лекции по теории научного атеизма. | место = Свердловск. | год = 1975. | издательство = Текст / МВ и ССО РСФСР. Уральск. гос. ун-т им. А. М. Горького Ч. 1 | страницы = | isbn = }}</ref>
<ref name="Star 20" >{{Книга | автор = | заглавие = История и культура провинциальных городов Пермского Прикамья: Матер. Всеросс. научно-практ. конф. | место = Березники | год = 1995 | издательство = | страницы = 39. Стариков В.В. Механизм религиозного контроля.| isbn = }}</ref>
<ref name="Лейбович 1" >{{Книга | автор = | заглавие = Лейбович Олег Леонидович. Википедия https://ru.wikipedia.org/wiki/%D0%9B%D0%B5%D0%B9%D0%B1%D0%BE%D0%B2%D0%B8%D1%87,_%D0%9E%D0%BB%D0%B5%D0%B3_%D0%9B%D0%B5%D0%BE%D0%BD%D0%B8%D0%B4%D0%BE%D0%B2%D0%B8%D1%87 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Липсиц 1" >{{Книга | автор = | заглавие = Липсиц Игорь Владимирович. Википедия https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BF%D1%81%D0%B8%D1%86,_%D0%98%D0%B3%D0%BE%D1%80%D1%8C_%D0%92%D0%BB%D0%B0%D0%B4%D0%B8%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B8%D1%87 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Липсиц" >{{Книга | автор = Липсиц Игорь Владимирович.| заглавие = Экономика. Б азовы й курс: У чебник для 10, 11 классов общ еобразоват. учрежд. 15-е издание.| место = Москва. | год = 2012 | издательство = ВИТА-ПРЕСС | страницы = 272 с. http://vvsosh1.ru/attachments/article/41/%D0%A3%D1%87%D0%B5%D0%B1%D0%BD%D0%B8%D0%BA%20%D1%8D%D0%BA%D0%BE%D0%BD%D0%BE%D0%BC%D0%B8%D0%BA%D0%B0%2010-11%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81.pdf| isbn = ISB N 9 7 8 -5 - 7 7 5 5 -2 3 4 6 -6 }}</ref>
<ref name="Захаров 1" >{{Книга | автор = Захаров Юрий Романович. Слово о товарище http://www.bf.pstu.ru/press-tsentr/poslednie-novosti/1798-slovo-o-tovarishche | заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Бакулин 1" >{{Книга | автор = Бакулин Владимир Иванович. Известные учёные https://www.famous-scientists.ru/103/| заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Шилов 1" >{{Книга | автор =Шилов Владимир Викторович. БФ ПНИПУ http://www.bf.pstu.ru/universitet/sveden/rukovodstvo-pedagogicheskij-nauchno-pedagogicheskij-sostav/125-universitet/svedeniya-ob-obrazovatelnoj-organizatsii/482-shilov-vladimir-viktorovich | заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Узлов 1" >{{Книга | автор = Узлов Николай Дмитриевич. Известные учёные https://www.famous-scientists.ru/11228/| заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Star 12" >{{Книга | автор = | заглавие = Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 6. Отв. редактор Беккер В. Ф. | место = Березники | год = 2007 | издательство = БФ ПГТУ | страницы =73-75 Стариков В. В. «Футурошок» и степень профессиональной пригодности различных типов личности в области российского кинематографа. | isbn = 978-5-91252-017-4}}</ref>
<ref name="Беккер 1" >{{Книга | автор = Беккер Вячеслав Филиппович. Известные учёные https://www.famous-scientists.ru/131/ | заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Баразгова 1" >{{Книга | автор = Баразгова Евгения Станиславовна. Уральский государственный университет в биографиях https://biography.ideafix.co/indexfd87.html?base=mag&id=a_0423| заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Антипьев 1" >{{Книга | автор = Антипьев Анатолий Григорьевич. Википедия https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%82%D0%B8%D0%BF%D1%8C%D0%B5%D0%B2,_%D0%90%D0%BD%D0%B0%D1%82%D0%BE%D0%BB%D0%B8%D0%B9_%D0%93%D1%80%D0%B8%D0%B3%D0%BE%D1%80%D1%8C%D0%B5%D0%B2%D0%B8%D1%87#:~:text=%D0%90%D0%BD%D0%B0%D1%82%D0%BE%CC%81%D0%BB%D0%B8%D0%B9%20%D0%93%D1%80%D0%B8%D0%B3%D0%BE%CC%81%D1%80%D1%8C%D0%B5%D0%B2%D0%B8%D1%87%20%D0%90%D0%BD%D1%82%D0%B8%CC%81%D0%BF%D1%8C%D0%B5%D0%B2%20(19%20%D0%B0%D0%B2%D0%B3%D1%83%D1%81%D1%82%D0%B0,%D1%81%D0%BE%D1%86%D0%B8%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8%20%D0%B8%20%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8%20%D0%9F%D0%B5%D1%80%D0%BC%D1%81%D0%BA%D0%BE%D0%B3%D0%BE%20%D1%83%D0%BD%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%82%D0%B5%D1%82%D0%B0.| заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Савцова 1" >{{Книга | автор = Савцова Надежда Ивановна. Уральский федеральный университет https://philos-urgi.urfu.ru/ru/o-departamente/sekcija-ontologii-i-teorii-poznanija/savcova/ | заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Анкин 1" >{{Книга | автор = Анкин Дмитрий Владимирович. Уральский Федеральный университет https://urfu.ru/ru/about/personal-pages/personal/person/dv.ankin/| заглавие = | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Фтопку" >{{Книга | автор = | заглавие = Исторический форум. Учебник господина Старикова. За и против.| место = | год = | издательство = | страницы = http://forum.istorichka.ru/cgi-bin/yabb2/YaBB.pl?num=1277905169| isbn = }}</ref>
<ref name="Приз 1" >{{Книга | автор = | заглавие = | место = | год = | издательство = | страницы = http://www.encyclopedia.ru/news/enc/detail/58584/ = }}</ref>
<ref name="Star 2">{{Книга | автор = | заглавие = Верхнекамский регион: экономические, социальные, историко-культурные проблемы: матер.регион. научно-практ. конф. Отв. редактор Узлов Н. Д. | место = Березники | год = 2002 | издательство = БФ ПГУ | страницы =285-286. Стариков В.В. Сравнительный анализ теорий и тестов на тип личности. |isbn = 5-94095-027-2 }}</ref>
<ref name="Star 8" >{{Книга | автор = | заглавие = Сборник научных трудов. Березниковский филиал Пермского государственного университета. Вып. 1. Рецензент Захаров Ю. Р.| место = Березники | год = 2005 | издательство = БФ ПГУ | страницы = 85-87. Стариков В. В. К вопросу о классификации исторических форм государственного правления. | isbn = }}</ref>
<ref name="Star 9" >{{Книга | автор = | заглавие = Сборник научных трудов. Березниковский филиал Пермского государственного университета. Вып. 1. Рецензент Захаров Ю. Р. | место = Березники | год = 2005 | издательство = БФ ПГУ | страницы = 88-90. Стариков В. В. О теоретических аспектах изложения истории. | isbn = }}</ref>
<ref name="Star 19" >{{Книга | автор = | заглавие = Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 5. Ответственный за выпуск Беккер В. Ф. | место = Березники | год = 2006 | издательство = БФ ПГТУ | страницы = 79.Стариков В. В. Тоталитаризм как результат неудачной попытки заменить конфликт всеобщим контролем. | isbn = 978-5-91252-004-4}}</ref>
<ref name="Star 6" >{{Книга | автор = | заглавие = Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 4. Ответственный за выпуск Беккер В. Ф.| место = Березники | год = 2005 | издательство = БФ ПГТУ | страницы = 49. Стариков В. В. Революция в исторической науке. | isbn = }}</ref>
<ref name="Star 7" >{{Книга | автор = | заглавие = Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 4. Ответственный за выпуск Беккер В. Ф.| место = Березники | год = 2005 | издательство = БФ ПГТУ | страницы = 81-86. Стариков В.В. Молчанова Е. А. К каким преступлениям склонны женщины? | isbn = }}</ref>
<ref name="Star 11" >{{Книга | автор = | заглавие = Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 6. Отв. редактор Беккер В. Ф.| место = Березники | год = 2007 | издательство = БФ ПГТУ | страницы = 18-26. Стариков В. В. Социология гениальной личности. | isbn = 978-5-91252-017-4}}</ref>
<ref name="Star 16" >{{Книга | автор = | заглавие =Наука в решении проблем Верхнекамского промышленного региона. Сборник научных трудов. Выпуск 3 Отв. за выпуск Беккер В. Ф. | место = Березники | год = 2003 | издательство = БФ ПГТУ | страницы = 53. Стариков В.В. Четыре типа личности политиков. | isbn = }}</ref>
<ref name="Star 21" >{{Книга | автор = | заглавие = Молодёжная наука Верхнекамья. Материалы пятой региональной конференции. (Березники, 14 мая 2008). Отв. ред. Беккер В. Ф. | место = Березники | год = 2008 | издательство = БФ ПГТУ | страницы = 362-366. Стариков А. В. Стариков В.В. "Выбор лифта социальной мобильности" | isbn = }}</ref>
<ref name="Star 22" >{{Книга | автор = | заглавие = Молодёжная наука Верхнекамья. Материалы пятой региональной конференции. (Березники, 14 мая 2008). Отв. ред. Беккер В. Ф. | место = Березники | год = 2008 | издательство = БФ ПГТУ | страницы = 362-366. Стариков А. В. Стариков В.В. Спорные вопросы в конфликтологии. | isbn = }}</ref>
<ref name="Star 23" >{{Книга | автор = | заглавие = Молодёжная наука Верхнекамья. Материалы пятой региональной конференции. (Березники, 14 мая 2008). Отв. ред. Беккер В. Ф. | место = Березники | год = 2008 | издательство = БФ ПГТУ | страницы = 368-371. Стариков А. В. Стариков В.В. Педагогическая антиутопия. | isbn = }}</ref>
<ref name="Star 17" >{{Книга | автор = | заглавие = Проблемные вопросы истории, культуры, образования, экономики северного Прикамья.: Матер. Всеросс. научно-практ. конф. Отв. редактор Шилов В. В.| место = Березники | год = 1994 | издательство = | страницы = 75 Стариков В.В. Стадии развития Левиафана. | isbn = 5-88005-004-1 }}</ref>
<ref name="Star 3" >{{Книга | автор = | заглавие = Проблемы социализации личности в период экономической нестабильности: матер. Междунар. Научно-практ. конф. Отв. редактор Шилов В. В.| место = Березники | год = 1999 | издательство = | страницы = 89-91. Стариков В.В. Азиатская формация. | ISBN = }}</ref>
<ref name="Star 18">{{Книга | автор = | заглавие = Историко-культурное наследие: новые открытия, сохранение, преемственность.- Материалы Всероссийской научно-практической конференции. Отв. ред. Шилов В. В.| место = Березники | год = 1999 | издательство = Березниковский филиал Пермского государственного университета. | страницы = 304-307 Стариков В. В. Конфликт школьных клик. | isbn =}}</ref>
<ref name="Star 10" >{{Книга | автор = | заглавие = Молодёжь России на рубеже веков: матер. Междунар. научно-практ. конф. Отв. редактор Шилов В. В. | место = Березники | год = 1999 | издательство = | страницы = 229-231. Стариков В.В. «Роковая» любовь как молодёжная проблема. | isbn = }}</ref>
<ref name="Star 14" >{{Книга | автор = | заглавие = Сохранение, восстановление, использование исторического, культурного, природного наследия народов России: матер. Междунар. Научно-практ. конф. Отв. редактор Шилов В. В.| место = Березники | год = 1998 | издательство = | страницы = 256-258.Стариков В.В. Влияние типа личности на выбор профессии или кто будет кем? | isbn = }}</ref>
<ref name="Star 13" >{{Книга | автор = | заглавие = Пермское Прикамье в истории Урала и России: матер. Всеросс. научной конф. Отв. редактор Шилов В. В. | место = Березники, | год = 2000 | издательство = ПГУ. | страницы = 248-249 .Стариков В.В. Стиль преподавания у разных типов личности педагогов. | isbn = }}</ref>
<ref name="Star 15" >{{Книга | автор = | заглавие = Пермский регион: история, современность, перспективы: матер. Междунар. научно-практ. конф. Отв. редактор Шилов В. В.| место = Березники | год = 2001 | издательство = БФ ПГУ | страницы = 347. Стариков В.В. Четыре «породы» руководителей и четыре «породы» подчинённых. | isbn = }}</ref>
<ref name="Star 4" >{{Книга | автор = | заглавие = Молодёжь Прикамья на рынке труда: матер. Межрегион. Научно-практ. конф. Научный редактор Антипьев А. Г. | место = Пермь | год = 2004 | издательство = Феникс | страницы = 84-87. Стариков В.В. Проблема безработицы для четырёх типов личности. | isbn = 5-94604-040-7}}</ref>
<ref name="Star 5" >{{Книга | автор = | заглавие = Качество социально-гуманитарного образования в ВУЗе: состояние, пути, формы и методы его повышения: матер. 2 международн. научно-практ. конф. Редактор Антипьев А. Г. | место = Пермь | год = 2004 | издательство = ПГУ, ПСИ, ПСИ МОСУ, ПССГК | страницы = 36-38.Стариков В. В. Система образования как рынок услуг.| isbn = 5-94604-041-5.}}</ref>
<ref name="Смелзер 1">{{Книга | автор = Нейл Смелзер | заглавие = Социология| место = М. | год = 1994 | издательство = Феникс | страницы = | isbn =5-7113-0106-3}}</ref>
<ref name="Масионис 1" >{{Книга | автор = Масионис | заглавие = Социология | место = СПб. | год = 2004 | издательство = Питер | страницы = | isbn = 5-94723-649-4.}}</ref>
<ref name="Lipsic 1" >{{Книга | автор = Липсиц И. В. | заглавие = Экономика: В 2 книгах. Учебник для 9 кл. общеобразовательных учреждений. – 7-е издание, доработанное. | место = М. | год = 2002. | издательство = Вита-Пресс | страницы = | isbn = 5-7755-0355-4 (Том 1).isbn =5-7755-0356-2 (Том 2). }}</ref>
<ref name="Star 1" >{{Книга | автор = Стариков В.В. Горюнов В.И. | заглавие = Занимательная социология. Учебно-методическое пособие. | место = Соликамск. | год = 1997. | издательство = СГПИ | страницы = | isbn = }}</ref>
<ref name="Diogen 1" >{{Книга | автор = Диоген Лаэртский. | заглавие = О жизни, учениях и изречениях знаменитых философов. | место = М. | год = 1986. | издательство = Мысль | страницы = | isbn = }}</ref>
}}
julis7xybni2p6bob15lye6kpw3tt70
Интересное обществознание/Специальная военная операция на Украине
0
30221
270334
270201
2026-10-10T04:45:33Z
ВалерийСтариков
79536
270334
wikitext
text/x-wiki
[[File:Shahed 136 rendering.png|thumb|Беспилотник Shahed 136 или Герань 2]]
[[File:Project 1164 Moskva 2012 G2.jpg|thumb| Ракетный крейсер "Москва"]]
[[Файл:Встреча_подразделений_ВС_РФ_и_ЛНР_в_Новоайдаре_008.png|thumb|Подразделение военной разведки ВС РФ в Новоайдаре]]
[[File:UK-MOD-Ukraine-2022-07-07.jpg|thumb|Карта специальной военной операции на Украине на 7 июля 2022 г.]]
[[Файл:1-14th FAR conducts HIRAIN exercise as part of DEFENDER-Europe 22 DVIDS7232028.jpg|thumb| Реактивная система залпового огня M 142 Himars]]
[[File:130417-M-SO590-119.JPG|thumb|Американская гаубица M 777 ]]
[[File:9th Light Armoured Marine Brigade Bastille Day 2013 Paris t114135.jpg|thumb|Французская самоходная гаубица CAESAR]]
[[File:Крымский мост 13 сентября 2019 года (1).jpg|thumb|Крымский мост]]
[[File:Leopard 2 A7.JPG|thumb|Леопард 2]]
[[File:M1A1 Abrams Tank in Camp Fallujah retouched.jpg|thumb|М 1 Абрамс]]
[[File:Archer i Eldställning.jpg|thumb|Archer (САУ, Швеция)]]
[[File:Army-2020-315.JPG|thumb|Беспилотник ZALA Ланцет]]
[[File:Alabino220415part1-42.jpg|thumb|ОТРК «Искандер-М» на репетиции Парада Победы 9 мая на Красной площади (22 апреля 2015 года).]]
[[File:Tornado-S (2).png|thumb|РСЗО 9К515 «Торнадо-С»]]
[[File:T-90M.jpg|thumb|Танк Т-90М "Прорыв"]]
[[File:JASDF MIM-104 Patriot PAC-2 at Kasuga Air Base November 25, 2017 01.jpg|thumb|Зенитное ракетное подразделение Patriot на позиции на авиабазе Касуга: машина управления, станция наведения ракет с ФАР, пусковая установка с двумя ракетами в контейнерах]]
[[File:NightRehearsal270417-27.jpg|thumb|2С35 «Коалиция-СВ»]]
[[File:Global Hawk 1.jpg|thumb|Беспилотник RQ-4 Global Hawk]]
[[File:F-16 June 2008.jpg|thumb|Американский самолёт Ф 16 Боевой сокол]]
[[Файл:Fab-1500-umpk.jpg|thumb|right|ФАБ-1500 с модулем УМПК]]
[[File:170mm M1989 Koksan - North Korea Victory Day-2013 01.jpg|thumb|right|Северная Корея САУ 1989 Koksan ]]
[[Файл:Морвичëв Андрей.jpg|thumb|right|Генерал Андрей Николаевич Мордвичёв]]
[[File:Status-6.jpg|thumb|right|Посейдон (подводный аппарат)]]
[[File:Screenshot of Burevestnik launch.png|thumb|right|Крылатая ракета Буревестник]]
==Причины спецоперации ==
Эта операция ещё не окончена, поэтому ещё не ясно, какие будут результаты этой операции и чья будет победа. В дальнейшем эта статья будет дополнена в соответствии с ходом событий на Украине. При создании этого параграфа Валерий Стариков опирался только на российские патриотические источники, потому что считает себя патриотом России.
Американская разведка оказывала поддержку движению националистов на Украине. Начало движения националистов уходит корнями в события Второй мировой войны, когда украинские националисты сначала принимали участие в войне на стороне Гитлера. Украинские националисты сформировали дивизию СС "Галичина" и вели партизанскую войну против советской власти ещё около 10 лет после окончания Второй мировой войны. СССР выиграл Вторую мировую войну и с большим трудом подавил это движение националистов. Лидером этого движения украинских националистов был Степан Бандера, который в конце концов был убит советским разведчиком Богданом Стащинским в Мюнхене в 1959 году при помощи выстрела в лицо из пистолета, распылившего ядовитое вещество (цианистый калий).<ref name="Бандера 1" />
Президент Украины Виктор Янукович действовал нерешительно и не смог разогнать [[:ru:w:Евромайдан|Евромайдан]] в 2014 году. Это закончилось провокацией с расстрелом Евромайдана снайперами. Вооружённые участники Евромайдана пошли на штурм органов законной власти и незаконный захват власти. После этих событий в 2014 году Крым и Севастополь на основании референдума добровольно отделились от Украины и вошли в состав Российской Федерации. Российские войска помогли этому процессу. А на Донбассе началась гражданская война Донецка и Луганска против националистических властей Украины. Донецкая и Луганская республики отделились от Украины, украинские войска были разгромлены вооружённой милицией этих республик. Российская федерация оказывала вооружённую поддержку этим республикам. В Минске были подписаны мирные соглашения, которые Украина не выполняла на деле. После этих событий США стали открыто оказывать экономическую и вооружённую поддержку националистическому правительству Украины, перевооружать украинскую армию. Армия Украины 8 лет безнаказанно обстреливала Донецк и Луганск, что привело к гибели значительного количества мирных жителей, разрушению зданий и сооружений. Внутри Украины националистическое правительство проводило террор и геноцид против русского населения. Газпром был вынужден построить газопроводы в обход Украины (Северный и Турецкий поток) на случай войны, чтобы обезопасить себя от возможности взрыва газопровода, проходящего по территории Украины. Украинские националисты построили дамбу, нарушили работу Северо-Крымского канала и объявили водную блокаду Крыма. Националистическое правительство запрещало преподавать в школах на русском языке, хотя русский язык является родным для значительной части населения Украины, особенно на Востоке и Юге Украины. Эти области были подарены большевиками Украине из состава России. Россия была вынуждена построить Крымский мост, чтобы иметь прямое автомобильное и железнодорожное сообщение между Россией и Крымом. Украина вела переговоры о вступлении в НАТО и Европейский Союз, что категорически не устраивало правительство Российской Федерации. Президент Владимир Владимирович Путин очертил "красные линии", где Украина должна входить в сферу влияния России.
===Новая военная техника и новая тактика ведения этой спецоперации===
Новые виды оружия появились и были применены на этой войне: дроны, высокоточные ракеты и артиллерия, РЭБ, спутниковая разведка, противотанковые средства, дистанционное минирование. Это вызвало необходимость изобрести новую тактику применения войск. Танковые клинья эпохи Второй мировой войны ушли в прошлое из-за широкого развития противотанковых ракет, дронов-камикадзе, высокоточной артиллерии. Сегодня самолёты-бомбардировщики не летают над территорией противника из-за опасности быть сбитыми с земли помощью зенитных ракетный комплексов. Выход из этого трудного положения нашли с помощью применения корректируемых авиационных бомб, которые сбрасываются с самолёта с безопасного расстояния в несколько десятков километров от цели, эти корректируемые авиационные бомбы по сравнению с ракетами являются более дешёвыми и более мощными. В этой специальной военной операции оборона оказалась сильнее нападения как в Первую мировую войну. Вместо танковых клиньев российские войска используют артиллерийско-пехотное наступление малыми группами на мотоциклах и квадроциклах для захвата опорных пунктов противника в степи.Мотоциклисты выполняют роль лёгкой конницы. Вместо лобовых штурмов укрепрайонов российская армия применяет охват слабых флангов противника, взятие укрепрайонов в клещи, перерезание тыловых дорог по которым происходит снабжение противника. По данным разведки, солдат ВСУ в передовом опорном пункте не так много. Но за российскими солдатами - умение и опыт.В траншеях происходит скоротечный стрелковый бой. В блиндажи боевиков летят гранаты. Происходит зачистка. На мотоцикле легче увернуться от дронов-камикадзе, да и снайперу попасть по быстро движущейся виляющей цели непросто. И если на мину колесом наехать, то последствий будет меньше, чем ногой наступить.Здесь используют максимум семь мотоциклов, один из них - для эвакуации раненных и убитых товарищей. На одного нашего бойца порой приходится два-три вражеских дрона-камикадзе. Несмотря на это, российские воины идут вперед и побеждают.Накопленный опыт, хорошее снабжение и современная РЭБ делают свое дело.<ref name="Мотоцикл 1" />
Русские широко применяют гиперзвуковые ракеты и дроны для уничтожения электростанций и штабных бункеров в глубоком тылу противника. Цель уничтожения электростанций - погрузить противника в каменный век, остановить работу военных заводов и железной дороги, вызвать недовольство населения отсутствием коммунальных услуг в городах (теплоснабжения, водоснабжения, газоснабжения, канализации). В 2025 г. на баллистических ракетах россияне вместо фальшивых целей начали устанавливать генераторы радиопомех, когда летит одна ракета и на ней начинают работать устройства радиопомех, то на экранах планшетов ПВО создается впечатление, что атакует 20, 30, 40 ракет. Если таких ракет несколько, то возникают сотни ложных целей, и куда стрелять, становится непонятно. Для прорыва украинского ПВО используются не только радиопомехи, применяются, например, и ложные цели, например, беспилотники "Герберы", атакуют вместе с ударными "Геранями". На ракетах устанавливают тепловые или радиолокационные ловушки. Они отстреливаются при входе в зону действия вражеского ПВО и "притягивают" на себя противоракеты». ПВО Украины не способно справиться с массированными российскими ударами по своим военным объектам.<ref name="Гербер 1" />
Американский предприниматель Илон Маск руководил созданием американской системы спутников Starlink. Вместо нескольких крупных спутников на орбите используются многочисленные небольшие аппараты, которые обеспечивают связь с наземными терминалами. По мере движения спутников вокруг Земли терминалы автоматически переключаются между ними, сохраняя доступ к мировой паутине. Основная задача запускаемых аппаратов — обеспечить украинские войска и украинские беспилотники высокоскоростным интернетом, это позволяет управлять войсками и беспилотниками в режиме on line. Наш ответ Илону Маску состоял в создании низкоорбитальной группировки спутников "Рассвет", созданной аэрокосмической компанией «Бюро 1440».К созданию полноценной группировки разработчик приступил в 2026 году. Первый пакетный запуск состоялся 23 марта: ракета вывела на орбиту 16 спутников. В июле «Бюро 1440» отправило в космос вторую партию из такого же количества аппаратов, к концу 2027 года группировка должна насчитывать 292 действующих спутника, в более отдаленной перспективе, к 2035 году, компания рассматривает возможность расширения группировки до 900 спутников. Для сравнения: на 26 сентября 2026 года на орбите находилось более 11 тысяч аппаратов американской группировки Starlink. Одно из основных различий заключается в высоте орбит. Для «Рассвета» первоначально была заявлена высота около 800 километров, тогда как спутники Starlink преимущественно работали на высоте около 550 километров. Система "Рассвет" позволит обеспечить связь между российскими подразделениями и управление российскими беспилотниками в режиме on line. Операторы смогут получать изображение с камер беспилотников «Герань» и корректировать их полет, находясь далеко от района боевых действий, что, в частности, позволит наносить точные удары по уязвимым деталям украинских мостов и движущимся железнодорожным локомотивам.<ref name="Рассвет 1" />
===Дроны (БПЛА) и боевые роботы становятся главным родом войск на войне?===
Войну на Украине часто называют "войной дронов". Война дронов стала революцией в военном деле. Дроны в этой войне применяются в воздухе, на воде, и на суше. Это вызвало необходимость создать в России новый род войск - Войска беспилотных систем. Формирование этого рода войск планируется завершить в 3 квартале 1925 года. <ref name="Дроны 1" /> Сегодня против каждого штурмовика или против каждого танка, как осы, летает несколько вражеских дронов. Нужно как-то решить эту техническую проблему с вражескими дронами. Русские пытаются решить эту техническую проблему с помощью установки решёток на танках, применения РЭБ, охотничих ружей с дробью и сеткой. В будущем возможно применение лазеров против дронов. Дроны, в основном, используются для разведки и нанесения ударов ("дроны-камикадзе"). Разведывательные дроны летают на высоте 15–20 км, видят с разрешением до 30 см. Могут висеть в воздухе 24–36 часов без посадки.
Ударные дроны бывают двух видов: FPV и барражирующие. Они различаются в зависимости от расстояния, на котором применяются. FPV применяются на коротком расстоянии, построен по вертолётной схеме с несколькими винтами, имеет электрический аккумулятор, видеокамеру, взрывное устройство. Пилот видит изображение с видеокамеры и управляет движением дрона.
Барражирующие дроны летят на длинное расстояние и бывают самолётного типа. Они имеют крылья, и более мощный двигатель (двигатель внутреннего сгорания или ракетный двигатель). Примеры барражирующего беспилотника: российская Герань, иранский SHahed, украинский Лютый. Они летят к цели по GPS или оптике. Дёшевы настолько, что применяются роями — по 10–100 штук одновременно.
Пока человек принимает решение о применении этого оружия. Но это только пока. Скоро это решение, возможно, будет принимать искусственный интеллект. Скоро появится дрон, который сам находит цель, сам её идентифицирует и сам атакует без команды оператора, поэтому применять против него РЭБ становится невозможно. Технически это уже возможно. Юридически и этически — огромный нерешённый вопрос. Кто несёт ответственность, если автономный дрон ударит по гражданскому объекту? Алгоритм? Программист? Командир, который дал разрешение на боевой вылет? Роевые атаки — когда сотни дронов действуют скоординированно по единому плану — уже тестируются в военных лабораториях. США, Китай, Израиль, Россия — все работают над этим. Противостоять рою из 500 дронов традиционными средствами ПВО невозможно: не хватит ракет-перехватчиков, каждая из которых стоит в сотни раз дороже атакующего аппарата.
Применение разведывательных дронов для корректировки артиллерийского огня позволило сократить бессмысленный расход снарядов и ракет для создания "лунного пейзажа" из воронок-кратеров на поле боя времён первой и второй мировых войн. Одним из главных преимуществ дронов является дешевизна этих дронов, когда дрон за 300 долларов может уничтожить танк за 5 миллионов долларов. Один оператор FPV-дрона с ноутбуком и $1 000 в кармане может остановить колонну бронетехники. Это не фантастика — это 2024–2025 годы. Военная наука перевернулась. <ref name="Дроны 2" />
Одно из средств борьбы с дронами - это РЭБ. Средства РЭБ могут глушить сигналы, перехватывать управление или пеленговать оператора, что снижает эффективность традиционных FPV-дронов. Чтобы избежать воздействия систем РЭБ были изобретены дроны с катушкой на оптоволокне, по которому передаётся сигнал, а не по радиоканалам. Оптоволоконный кабель передает данные через световые импульсы.
'''Преимущества дронов на оптоволокне:'''
• устойчивость к РЭБ: радиосигналов нет, их нельзя заглушить;
• высокое качество видео;
• скрытность: дрон не излучает сигналы, что затрудняет его обнаружение;
'''Недостатки дронов на оптоволокне:'''
• дальность полета дрона на оптоволокне ограничена длиной кабеля (достигает 20 км);
• уязвимость кабеля: он может порваться, зацепившись за препятствия;
• ограниченная маневренность: кабель снижает свободу движений;
• дополнительная масса: катушка уменьшает полезную нагрузку.
Пример российского дрона на оптоволокне - это дрон "Князь Вандал Новгородский".<ref name="Оптоволокно 1" />
В начале 2026 года стало известно, что украинская армия планирует создать killzone на 50 километров вглубь территории российской армии от линии боевого соприкосновения российских и украинских войск, где с помощью украинских беспилотников должно "уничтожаться всё, что движется". Не последнюю роль в этой стратегии играют силы спецбатальона БПЛА ВСУ «Птицы Мадьяра».Поэтому российские войска ведут ежедневную активнейшую охоту за дроноводами на линии фронта и регулярно бьют по местам сборки беспилотников для ВСУ в украинском тылу. Соревнование в сфере дронов напоминает соревнование щита и меча, новое изобретение в сфере нападения вызывает ответное изобретение в сфере защиты. <ref name="Киллзона 1" /> До начала 2026 года схема противодействия украинским беспилотным угрозам была относительно проста: средства РЭБ глушат каналы управления, радары и оптические детекторы обнаруживают носитель, стрелковое оружие или автоматические пушки добивают то, что подлетело близко. Появление американских (а не собранных на Украине в простом гараже) беспилотников Hornet ("Марсианин 2") стало очередным вызовом для российской обороны на фронте. Во-первых, этот беспилотник самолётного типа летает слишком далеко - на расстояние до 150 километров, во-вторых, он летает слишком быстро - до 300 километров в час, в-третьих, этот беспилотник имеет нестандартные зашифрованные частоты: типовые дрон-детекторы радиоизлучения эти беспилотники не видят, в-четвёртых, этот беспилотник имеет наведение на цель с помощью искусственного интеллекта: система сама ориентируется на местности без сигнала со спутника GPS или связи с оператором (которые можно заглушить с помощью РЭБ), беспилотник сам захватывает цель и корректирует заход на цель, оператор может лишь задать район, в-пятых, лопасти «Марсианина» изготовлены с применением специальной резины, поэтому услышать его по звуку с дальнего расстояния очень сложно, таким образом, этот беспилотник очень трудно сбить обычным стрелковым оружием. Российские дроноводы научились сбивать дорогие беспилотники Марсианин 2 с помощью дешёвых российских беспилотников-перехватчиков Ёлка. <ref name="Марсианин 1" />
Российские войска в 2026 г. стали применять беспилотники Герань 5 на реактивной тяге вместо поршневого двигателя на беспилотниках Герань 1.
Герань 5 имеет следующие преимущества перед Герань 1:
* более высокая скорость: 600 км в час вместо 180 км в час.
* большая высота полёта: 8 км вместо 4 км.
* форма крыльев: прямое крыло и цилиндрический фюзеляж вместо схемы «летающего крыла» треугольной формы.
В результате украинские мобильные огневые группы почти не могут сбивать российские реактивные беспилотники Герань 5, в отличие от поршневых беспилотников Герань 1. Украинские зенитчики не успевают среагировать на пролёт реактивного беспилотника Герань 5 из-за высокой скорости этого беспилотника. Ручные ПЗРК типа «Игла» или «Стингер», которыми стреляют с плеча, их просто не достают или не догоняют. Украинские радары плохо "видят" на экране беспилотники Герань 5 из-за самолётной формы крыла. Ракеты-перехватчики от Patriot, NASAMS, URIS-T стоят слишком дорого чтобы их можно было использовать против дешёвых российских дронов Герань 5. К тому же американцы потратили слишком много ракет-перехватчиков в войне с Ираном в Персидском заливе и американцам просто нечего давать украинцам. В результате ПВО Украины оказалось бессильно против реактивных беспилотников Герань 5.<ref name="Реактивная Герань 1" />
Наземные робототехнические комплексы показали свою эффективность в ходе боевых действий в этой войне, боевые роботы осуществляют огневое поражение, разведку, минирование, подвоз боеприпасов и эвакуацию раненых.<ref name="Роботы 1" />
==Ход спецоперации ==
===Молниеносная война (блицкриг)===
Все эти причины вынудили президента Российской Федерации Владимира Владимировича Путина начать специальную военную операцию на Украине 24 февраля 2022 года. Первоначально Россия попыталась совершить классический блицкриг — молниеносную войну<ref name="Блицкриг 1" />. Наступление российских войск проходило с трёх сторон - с севера из Белоруссии на Киев, с Юга из Крыма и с востока из Луганска и Донецка. Численное превосходство войск было на стороне Киева, но Российская Федерация показала полное техническое превосходство, особенно, в авиации, артиллерии и ракетном оружии. В начале войны Россия официально не проводила мобилизацию и не использовала "срочников", в российской армии воевали только контрактники, а Украина провела мобилизацию резервистов. Украина стала полигоном для испытания нового ракетного оружия России. На Украине российская армия действовала по сирийскому образцу, поражая новейшими ракетами Калибр <ref name="Калибр 1" />, Искандер <ref name="Искандер 1" />и Кинжал <ref name="Кинжал 1" /> украинские войска и войска иностранных добровольцев и наёмников, военную промышленность, железнодорожные станции и бензохранилища по всей территории Украины. Нигде эти украинские войска не чувствовали себя в безопасности. В начале спецоперации украинская авиация и ПВО понесли большие потери в первую очередь.<ref name="Авиация 1" /> Украинские войска ответили обстрелами Донецка и Луганска ракетами "Точка У" <ref name="Точка 1" /> и РСЗО "Град"<ref name="Град 1" />. Многие в России надеялись, что российские войска на Украине будут встречены цветами, но эти надежды не оправдались, фактически, на Украине эта военная спецоперация превратилась в новую фазу ожесточённой гражданской войны. Украинские войска по совету американских советников действовали как террористы в Сирии - прикрывались мирным русскоязычным населением как живым щитом, разрушали из своей артиллерии мирные города Юго-Востока Украины, устраивали провокации с расстрелом мирного русскоязычного населения с целью обвинить российские войска в этом преступлении.
К концу апреля 2022 года российские войска освободили от украинских националистов территорию Херсонской области, части Харьковской и Запорожской областей. Была восстановлена работа Северо-Крымского канала, отвоёван сухопутный коридор из России в Крым, отвоёвано всё побережье Азовского моря вместе с портами. Особенно ожесточённое сопротивление националистического полка "Азов" и ВСУ российская армия встретила в городе Мариуполь. Город был, фактически, разрушен, были значительные жертвы среди мирного русскоязычного населения. Остатки полка "Азов" укрылись в подземельях под заводом "Азовсталь", где они были уничтожены с помощью крупноколиберной артиллерии и супербомб ФАБ. 20 мая остатки полка "Азов" позорно сдались российским войскам.<ref name="Азов 1" /> Эти военнопленные из полка "Азов" были частично уничтожены в российской тюрьме самой украинской армией с помощью ракет Хаймерс, потому что эти украинские военнопленные начали давать показания о преступлениях украинской армии. Позднее этих украинских военнопленных из полка Азов обменяли на российских военнопленных, которые в плену подвергались жестоким пыткам.
===Затяжная война на истощение. Кризис в спецоперации и отступление российской армии.===
После неудачи молниеносной войны Российская Федерация начала вторую фазу операции — войну на истощение<ref name="Истощение" />. Российские войска ушли из Киевской, Сумской и Черниговской областей и сосредоточили все силы на разгроме самой большой группировки украинских войск, сосредоточенной в части Луганской и Донецкой областей, чтобы прекратить артиллерийские обстрелы Донецка и Луганска. Российская армия в ходе спецоперации изменила свою тактику. В начале спецоперации российская армия не рассчитывала на серьёзное сопротивление украинцев и стремилась быстро продвигаться к Киеву, но в тылу у российской армии действовали диверсионные группы, которые наносили значительный ущерб колоннам снабжения. К тому же стало ощущаться численное превосходство украинской армии и наличие сильных укреплений на западной территории Донбасса. Целью новой тактики российской армии стало "перемалывание" живой силы и техники на Донбассе. Результатом этой новой тактики стали значительные потери украинской армии, которая погибала в окружённых городах от действий российской артиллерии. Российская артиллерия имела подавляющее превосходство над украинской артиллерией. Украинская армия пряталась в крупных городах за спиной мирного населения как за "живым щитом". В ответ российская армия применила тактику штурмовых групп, которую она применяла ещё в годы второй мировой войны. Передовые группы после разведки с дронов и поддержки артиллерии штурмуют линию соприкосновения. Когда противник перебрасывает резервы, то идет либо удержание позиции, либо отход, а по подходящим резервам начинает работать артиллерия. После уничтожения резервов, позиции занимаются вновь и российские солдаты закрепляются на них.<ref name="Штурмовики 1" /> В результате потери российской армии в живой силе стали минимальными. Недостатком этой российской тактики "огненного вала" стало снижение скорости наступления российской армии.<ref name="Огненный вал 1" /> Чтобы увеличить эту скорость нужно проводить операции на окружение украинской армии. В открытой степи российская артиллерия выжигает укрепления украинской армии, а только потом приходит российская пехота и производит зачистку от чудом уцелевших украинских солдат. Украинская армия бросает трупы своих солдат и своих раненных солдат. Средством этой новой тактики российской армии стало окружение отдельных укрепрайонов украинской армии, сосредоточенных в городах Луганской и Донецкой областей. Линия обороны украинской армии была сначала проломлена в городе Попасная, а затем украинские войска были окружены и сдались в Северо-Донецке и Лисичанске. Наступление из города Попасная развивалось в разные стороны как лепестки цветка. В дальнейшем будут окружены и другие узлы обороны украинской армии - Славянск, Краматорск и Авдеевка. Именно из Авдеевки идут террористические обстрелы Донецка, из-за которых имеются многочисленные жертвы среди мирного населения.
Запад увеличивает военную помощь Украине с помощью поставок крупнокалиберной артиллерии и реактивных систем залпового огня. В ответ российская армия старалась нарушить железнодорожные поставки оружия на Украине. Для этого российская армия наносила удары по электроподстанциям на железной дороге, чтобы электровозы не могли тянуть вагоны с оружием и военной техникой. Целью операции является взятие прежде всего промышленных районов Востока Украины, портов и верфей Юга Украины, где значительную часть составляет русское население. Кризис в войне произошёл в сентябре 2022 г. В начале сентября 2022 г. украинские войска начали стремительное контрнаступление в Харьковской области. Российской армией были оставлены города Балаклея и Изюм, затем Красный Лиман и Купянск.<ref name="Отступление 1" /> Командующий российской группировкой "Центр" генерал А. П. Лапин был отправлен в отставку. Причинами этого кризиса стало превосходство украинской армии в количестве пехоты, участие в в составе украинской армии значительного количества западных наёмников (поляки, англичане, американцы, румыны), значительные поставки самого современного западного оружия - противотанковых ракет Javelin<ref name="Джевелин 1" />, переносных зенитно-ракетных комплексов Stinger<ref name="Стингер 1" />, реактивных систем залпового огня M 142 Himars<ref name="Хаймарс 1" />, противокорабельных ракет Harpoon<ref name="Гарпун 1" />, турецких беспилотников Bayraktar<ref name="Байрахтар 1" />, американских гаубиц M 777<ref name="777 1" />, французских самоходных гаубиц CAESAR<ref name="Цезарь 1" /> и т. д. Противотанковая ракета Javelin бьёт в башню танка сверху, где броня самая тонкая. Это заставило российских танкистов приваривать сваркой ограждение и укладывать мешки с песком сверху на башню танка.
Снаряды от РСЗО M 142 Himars имеют коррекцию по GPS, поэтому способны очень точно поражать цель, после этого РСЗО M 142 Himars очень быстро покидает место пуска снарядов, скрываясь от ответного огня по принципу "стреляй и беги". Российское командование ищет решение этой проблемы. Российское ПВО научилось сбивать значительную часть снарядов Himars, но не все. Российское командование пытается использовать против РСЗО M 142 Himars барражирующие беспилотники-камикадзе Ланцет 3<ref name="Ланцет 1" />. Снаряды от РСЗО M 142 Himars позднее повредили Антоновский мост в Херсоне и шлюзы на Каховской ГЭС, что стало одной из причин отступления российской армии из Херсона. 1 января 2023 г. Снаряды Himers было разрушено ПТУ в Макеевке, где размещались мобилизованные солдаты, по сообщениям российского министерства обороны в результате этого удара погибло 89 российских солдат. Установка HIMARS, из которой вёлся обстрел ПТУ в Макеевке, была уничтожена ответным огнём. Основной причиной произошедшего стало включение, вопреки запрету, личным составом мобильных телефонов. Этот фактор позволил противнику запеленговать и определить координаты расположения военнослужащих для нанесения удара. Второй причиной трагедии стала скученность подразделения в одном месте, нужно рассредотачиваться. Третьей возможной причиной стало наличие украинских агентов среди местного населения, которые и навели ракеты на цель. Необходимо усилить работу военной контрразведки, которая должна вычищать украинскую агентуру.<ref name="Хаймарс 2" />
Российская армия научилась противостоять американским комплексам HIMARS. Достичь этого удалось за счет трех составляющих:
* Места хранения боеприпасов и размещения личного состава были рассредоточены.
* Особенно эффективными оказались «Панцири». В передаче «Военная приемка» представитель «Ростеха» заявил о росте количества случаев, когда российские комплексы боекомплектом из 12 ракет без промаха сбивают 12 реактивных снарядов РСЗО HIMARS.
* Превращение управляемого высокоточного боеприпаса в неуправляемый кусок железа с помощью средств радиоэлектронной борьбы (РЭБ). Этот кусок железа летит не туда, куда нужно.<ref name="Хаймарс 3" />
В декабре 2022 года произошли несколько атак украинских беспилотников по аэродромам дальней стратегической авиации России в г. Энгельс Саратовской области и по авиабазе Дягилево в Рязанской области. В результате этих атак было повреждено несколько российских самолётов, способных нести ядерное оружие. Украинская армия во время наступления под Харьковом применила новую тактику - быстрое продвижение диверсионно-разведывательных групп на легко бронированной технике по тылам российской армии, когда эти группы перерезают дороги, по которым идёт снабжение, под угрозой окружения российская армия вынуждена отступать.<ref name="ДРГ 1" />. Американские советники, фактически, руководят украинской армией, предоставляют разведывательную информацию со спутников в режиме реального времени<ref name="Спутники 1" />, проводят обучение украинских солдат обращению с американским оружием. 14 апреля 2022 г. украинской ракетой Нептун был затоплен флагман черноморского флота России ракетный крейсер "Москва". По российским данным, американская сторона с помощью спутниковых данных идентифицировала корабль и предоставила его точные координаты украинской армии. Хотя, по другим данным, США провели успешную скрытную операцию по ликвидации Флагмана Черноморского Флота, который отслеживал самолёты, вылетающие из Румынии на территорию Украины. Сначала по крейсеру ударили с беспилотника – разбили локаторы и антенны. Крейсер сбил один беспилотник, но уже ослеп наполовину. В качестве «убийцы» крейсера выбрали противокорабельную ракету, но не украинский «Нептун», а ракету пятого поколения NSM (Naval Strike Missile, дальность поражения – 185 км, разработка Норвегия-США).NSM способна выходить на цель по запрограммированному маршруту с корректировкой по GPS, самостоятельно находить цель, подлетая к ней на высоте 3-5 метров. Эту ракету невозможно обнаружить в шторм на фоне волн и брызг. Министерство Обороны РФ опубликовало данные по потерям среди экипажа «Москвы»: один погибший и 27 пропавших без вести по сути означают 28 погибших. Это может указывать на попадание в крейсер двух крылатых ракет NSM, а не одной.<ref name="Москва 1" /> Фактически, Россия на Украине столкнулась со всей мощью НАТО, пока за исключением регулярных войск и ядерного оружия. Россия применила против украинских электростанций беспилотник Герань 2, то есть перекрашенный иранский беспилотник-камикадзе Shahed 129. Этот иранский беспилотник был скопирован с американского беспилотника MQ-1 Predator и с израильского беспилотника Hermes 450. Вообще, эта война стала войной беспилотников. Недостаток использования западной военной техники на Украине состоит в том, что на Украине не существует ремонтной базы для этой техники, поэтому эта техника - это техника одного боя. Для малейшего ремонта эту технику нужно отправлять на родину или бросать на поле боя. Немецкие танки "Тигр" тоже были лучше советских танков Т 34 и может даже ИС 2, но танки "Тигр" были слишком сложными и их нужно было отправлять для серьёзного ремонта в Германию, а советские танки можно было отремонтировать в полевых условиях в ремонтных мастерских за 1 день. К тому же Россия целенаправленно уничтожала все танкоремонтные заводы на Украине сегодня с помощью ракет.
В конце сентября 2022 г. были проведены диверсии и взрывы на трёх нитках газопровода Северный поток. Четвёртая нитка газопровода Северный поток уцелела. Эта диверсия была выгодна США, Британии, Украине и Польше. Германия, Дания и Швеция расследуют этот инцидент, а Россию не допустили до этого расследования, чтобы скрыть виновника этого взрыва. Расследование показало, что газопроводы были повреждены четырьмя взрывами.3 ноября о причастности Великобритании к взрывам на «Северных потоках» заявил глава Совбеза РФ Николай Патрушев. По его утверждению, Лиз Трасс, в то время занимавшая пост премьер-министра страны, сразу после взрывов на газопроводах отправила госсекретарю США Энтони Блинкену SMS-сообщение со словами «Все сделано» <ref name="Северный поток 1" /> Заслуженный американский журналист Сеймур Херш 8 февраля 2023 года опубликовал статью о том, что эти трубопроводы были взорваны в результате тайной морской операции, организованной США и Норвегией. В июне 2022 г. американские водолазы, с помощью норвежских моряков, действовавшие под прикрытием учений НАТО BALTOPS 22, заложили взрывчатку с дистанционным управлением, которая три месяца спустя уничтожила три из четырех трубопроводов «Северный Поток».<ref name="Северный поток 2" /> В ответ на взрыв газопровода Северный поток Владимир Путин предложил президенту Турции Реджепу Эрдогану построить ещё один газопровод в Турцию для продажи газа европейским потребителям. Российский газ должен пойти к европейским потребителям через Турцию вместо пути по газопроводу Северный поток в Германию. Видимо, Турция оказалась более надёжным партнёром России, чем Германия.<ref name="Эрдоган 1" /> 8 октября 2022 г. был взорван Крымский мост с помощью гражданского большегрузного автомобиля с мощным зарядом взрывчатки. В результате два пролёта одной ветки автомобильного моста упали в море. От взрыва загорелись 7 цистерн с топливом на железнодорожном мосту, которые вёз грузовой поезд. Одну ветку автомобильного моста нужно восстанавливать, а по другой ветке автомобильного моста в тот же день пустили реверсивное движение. По железнодорожному мосту в тот же день пустили первый после аварии поезд. Груз со взрывчаткой был замаскирован под рулоны со строительной плёнкой, груз со взрывчаткой был вывезен из Одессы в Болгарию по "зерновому" коридору, затем через Грузию и Армению ввезён в Россию. Крымский мост был восстановлен за 55 дней и 5 декабря 2022 г. Путин сам проехал по восстановленному Крымскому мосту на автомобиле.<ref name="Крымский мост 1" />
===Украина во тьме. Перемалывание украинской армии в "Бахмутской мясорубке". ===
В апреле 2022 г. был назначен первый командующий специальной военной операцией - генерал Александр Дворников, в октябре 2022 г. вместо него был назначен генерал Сергей Суровикин по прозвищу Генерал Армагеддон, который знаменит тем, что, как Георгий Жуков, привык выполнять приказы Верховного главнокомандующего любой ценой.<ref name="Армагедон 1" /> 11 января 2023 года главнокомандующим на Украине назначен начальник штаба ВС РФ Валерий Герасимов, а его заместителем - Сергей Суровикин. Скрытый смысл этого назначения состоял в том, чтобы организовать оборону.<ref name="Герасимов 1" /> Ответ Путина на взрыв Крымского моста - это массированный ракетный удар по инфраструктуре на всей территории Украины - по электростанциям, зданиям Совета безопасности Украины, по центру Киева 10 и 11 октября 2022 г. Многие города Украины оказались без электричества, водоснабжения, интернета и железнодорожного сообщения. Около 40% электростанций на Украине были повреждены.<ref name="Электро 1" /> В ответ украинская армия совершила атаку 9 воздушных дронов и 7 автономных морских беспилотников на Черноморский флот России в Севастопольской бухте. По российским данным, матрос Артём Жильцов вовремя заметил подводный беспилотник, у которого над водой торчала только камера и Артём Жильцов поднял боевую тревогу, морские беспилотники были уничтожены. Эти беспилотники были подняты российскими моряками со дна моря и оказалось, что у этих беспилотников есть навигационные модули канадского производства. Эти беспилотники были запущены с побережья в районе Одессы, а 1 беспилотник был запущен с украинского торгового корабля, который вывозил зерно из Одессы по "зерновому" коридору. Эта атака была успешно отбита. В результате морской тральщик "Иван Голубец" получил незначительное повреждение. Было повреждено боносетевое заграждение, которое закрывает вход в Севастопольскую бухту. Министерство обороны России заявило, что атаки на Черноморский флот и на газопроводы "Северный поток" были организованы британскими специалистами, находящимися в городе Очаков. Вооружённые силы России нанесли удар по центру, в котором британские специалисты готовили украинских боевиков для нападения на Черноморский флот. "Зерновая" сделка - это договор о том, что Россия не будет препятствовать украинским кораблям вывозить зерно из Одессы в бедные страны Африки и развитые страны Запада в обмен на возможность России продавать на экспорт зерно и химические удобрения вопреки санкционной политике Запада. В ответ на атаку на Черноморский флот Россия сначала вышла из зерновой сделки, а затем по настоятельной просьбе президента Турции Реджепа Эрдогана вернулась в эту сделку. <ref name="Флот 1" /> 17 июля 2023 года Россия официально объявила о окончательном выходе из зерновой сделки из-за того, что, по мнению России, Запад так и не выполнил те пункты сделки, в которых была заинтересована Россия, а Украина неоднократно предпринимала шаги, направленные на подрыв сделки. Это атаки из демилитаризованной зоны Черного моря беспилотных катеров на Севастополь и корабли, охраняющие проложенные по дну моря газопроводы. Это подрыв аммиакопровода «Тольятти – Одесса» и последняя атака на Крымский мост. Зерно, которое должно было спасти от голода народы беднейших развивающихся стран, направлялось преимущественно в Западную Европу. Пять самых бедных стран (Афганистан, Эфиопия, Сомали, Судан и Йемен) получили только 2,5% от вывезенного зерна. <ref name="Зерно 1" /> 17 июля 2023 г. украинские надводные беспилотники атаковали Крымский мост, пострадали 2 пролёта автомобильного моста, погибли 2 человека. <ref name="Мост 1" />
Наступление украинской армии в Харьковской области в сентябре 2022 г. было остановлено российской армией на рубеже городов Сватово и Кременная. Ожесточённые бои развернулись на подступах к Херсону. Российская артиллерия уничтожала танковые колонны украинцев в открытой степи. Это напоминало Курскую битву. Вооружённые силы Украины повредили все мосты через Днепр под Херсоном, что затруднило снабжение российских войск и мирного населения. Херсон оказался под угрозой затопления в случае разрушения плотины Каховской ГЭС. 30 тысяч российских солдат под Херсоном находились под угрозой окружения, поэтому генерал Суровикин 9 ноября 2022 г. заявил о необходимости вывести российские войска из Херсона с правого берега Днепра на левый. <ref name="Суровикин 2" /> 11 ноября 2022 г. был закончен вывод российских войск и военной техники из Херсона. Российские войска взорвали все мосты через Днепр в Херсоне, в том числе два пролёта Антоновского моста и автомобильный мост на Каховской ГЭС. Российские войска заняли оборону на левом берегу Днепра на заранее подготовленных линиях обороны.
Вооружённые силы России построили мощные линии обороны с железобетонными укреплениями по всей линии обороны на Украине<ref name="Доты 1" />. У украинцев и среди иностранных наёмников были большие потери. Они стали отказываться идти в атаку, поэтому в украинской армии ввели заградительные отряды из националистов и наёмников, которые гнали вперёд на убой необученных солдат из территориальной обороны. В Луганской и Донецкой народных республиках, Херсонской и Запорожской областях провели референдумы, где подавляющим большинством голосов проголосовали о вхождение в состав России. 30 сентября в Москве было закреплено это решение.<ref name="Референдум 1" />. 21 сентября 2022 г. Владимир Путин объявил частичную мобилизацию. Предполагалось мобилизовать 300 тыс. человек, но фактически было мобилизовано больше - 318 тыс. человек из-за большого количества добровольцев. <ref name="Мобилизация 1" />Это позволило преодолеть отставание российской армии в количестве пехоты, захватывать крупные города, проводить крупные операции на окружение. Эту войну Россия начала как полицейскую операцию с маленькой профессиональной армией, но неудачи начала войны заставили Россию с помощью частичной мобилизации перейти к массовой армии. Оборонная промышленность России стала работать на полную мощность. Владимир Путин создал Специальный координационный совет при правительстве РФ, который напоминал ГКО (Государственный комитет обороны) при Сталине, этот ГКО имел чрезвычайные полномочия и превратил страну в единый военный лагерь.<ref name="ГКО 1" /> Владимир Путин ввёл военное положение в Херсонской и Запорожской областях, Донецкой и Луганской республике. <ref name="Военное положение 1" />
В декабре 2022 года наметился перелом в ходе войны. Российские войска построили мощные эшелонированные линии обороны, закопались в землю. Под Бахмутом (Артёмовском) произошла "Бахмутская мясорубка". Российская частная военная компания Вагнер стала "перемалывать" украинские войска и польских наёмников. Под Бахмутом были перемолоты все украинские резервы, без которых невозможно организовать крупное наступление. Группа Вагнер - это российский штрафной батальон, бойцов этой группы часто набирают в российских тюрьмах из заключённых, которые получают досрочное освобождение после службы в течение 6 месяцев и очень высокую зарплату, бойцы этой группы - это штурмовики, которые в ближнем бою предпочитают действовать ножами, им нечего терять, они действуют отчаянно и никогда не отступают без приказа.<ref name="Вагнер 1" /> Российские войска стараются окружать узлы обороны, например, город Бахмут, чтобы перерезать снабжение боеприпасами, подтягивание резервов, вывоз раненных. Применение танков для окружения сегодня осложнено применением пехотой переносных противотанковых ракет Javelin. К тому же на Донбассе существует очень плотная застройка, когда один город переходит в другой, каждый из этих городов можно превратить в узел обороны и трудно организовать широкие танковые прорывы на окружение противника.Украинская армия по совету американцев сделала ошибку, когда продолжала оборону Бахмута, несмотря на угрозу окружения. Российская армия была вынуждена вести городские бои, несмотря на то, что это является самым сложным видом боя. Использовать большие массы войск в городских боях неэффективно. Это чревато крупными, неоправданными потерями. Поэтому российская армия вернулась к идее отдельных штурмовых групп. Что-то около взводной тактической группы, усиленной танком, снайперами, саперами или расчетом ПТУР. Отдельные штурмовые группы продвигаются по улицам города. На удалении движется основная группировка, включающая в себя резерв, самоходную артиллерию, расчет БПЛА, штаб командования, группу управления огнем. Когда одна из штурмовых групп натыкается на опорный пункт противника, то она неизбежно вступает в бой, передает координаты командованию. Старший командир, используя приданную авиацию, артиллерию, огнеметные системы, наносит огневое поражение противнику, разрушая здание, а штурмовая группа проводит зачистку развалин.При необходимости для помощи штурмовой группе, а также для эвакуации раненых, выделяются дополнительные силы из резерва. В то же время соседние штурмовые группы продвигаются вперед, проводя охват опорного пункта противника. Подобный маневр существенно затрудняет подход и маневр резервов противника, как и его отход.Это пример классической схемы, по которой действовали наши войска, например, во время второй чеченской кампании. Так же в основном действуют сейчас «вагнеровцы», морпехи, десантники. Правда, с учетом реалий современного боя. Штурмовая группа, двигаясь по улицам в городской застройке, вынуждена придерживаться определенных правил. Бронетехника движется не в голове, а в тылу штурмовой группы. Пехота разбита на две колонны. Колонны движутся по разным сторонам улицы, напротив друг друга. Стрелки перемещаются в шахматном порядке. Стрелки предохраняют бронетехнику от ударов вражеских гранатомётчиков. Особое внимание пехота обращает на окна подвалов, первых и последних этажей. Нужно минировать возможные направления движения противника. Победа над противником закрепляется только в ходе продвижения пехоты. Победа российской армии в Бахмуте и Соледаре была достигнута за счёт увеличения численности пехоты. К сожалению, именно крайний недостаток пехоты был одной из главных причин неудач российской армии весной и летом 2022 года. Беспилотные аппараты позволяют обеспечить непрерывное круглосуточное наблюдение за полем боя для разведки. Именно массовое распространение высокоточных средств поражения в перспективе должно стать решающим для ведения успешных городских боёв. Пока у российской армии есть проблемы с производством и оснащением этими высокоточными средствами, поэтому городские бои идут так долго. Победа под Соледаром и Бахмутом позволила российской армии сбить спесь, уменьшить оптимизм в украинской армии и у западных союзников после их осенних успехов под Харьковом и Херсоном. <ref name="Бахмут 1" /> Артёмовск (Бахмут) был полностью взят российской армией 20 мая 2023 года, спустя 224 дня кровопролитных боев.<ref name="Бахмут 5" /> Потери украинской армии только под Бахмутом достигли 30 тысяч солдат.<ref name="Потери 3" />
Российские войска провели наступление не только под Бахмутом (Артёмовском), но и под Авдеевкой, Марьинкой и Угледаром. Острая необходимость для российской армии скорее взять эти города состоит в том, что именно из Марьинки и Авдеевки украинские войска ведут жестокие обстрелы мирного населения Донецка. Российские войска используют под Авдеевкой и Марьинкой успешный опыт, полученный под Артемовском, — окружают эти города и отрезают их от снабжения. Российская артиллерия корректирует свой огонь с помощью беспилотных летательных аппаратов. Российские огнемётные системы ТОС-1А "Солнцепёк" выжигают всё живое на украинских позициях. <ref name="Авдеевка 1" /> Наступление под Угледаром развивалось не столь успешно. Морские пехотинцы Тихоокеанского флота понесли здесь большие потери, но сумели закрепиться в пригородах этого города. Причина этого неудачного наступления - ошибки командующего этой российской группировки Рустама Мурадова, за это он был отправлен в отставку <ref name="Мурадов 1" />. В боях за Угледар нашим военнослужащим пришлось сменить тактику и отказаться от лобовых атак. Идет планомерный охват города, наши бойцы заходят с флангов, потихоньку, чтобы минимизировать потери личного состава. <ref name="Угледар 1" />
Развитие украинской ПВО ограничило полёты российской авиации над территорией Украины. Чтобы решить эту проблему российская армия применила планирующие авиабомбы и беспилотные летательные аппараты ("камикадзе") "Ланцет". Российский барражирующий боеприпас «Ланцет» имеет дальность 40 -70 километров. Украинские артиллеристы были вынуждены строить ложные орудия из брёвен, ставить железные сетки над своими орудиями, чтобы обезопасить себя от удара сверху "Ланцетом", но эти сетки оказались неэффективными. Объектами для поражения "Ланцетов" становятся украинские танки, самоходки, гаубицы, БМП, БТР. Новая тактика Российской армии: беспилотники «Герань» выманивают зенитно-ракетные комплексы на себя. А после того, как украинская ПВО себя обнаруживает, по ней тут же наносится удар «Ланцетом». Один российский самолет выманивает на себя силы противовоздушной обороны, а второй российский самолет наносит удар по украинской ПВО. <ref name="Авиабомба 1" />
Глава Еврокомиссии Урсула фон дер Ляйен оценила потери ВСУ с начала конфликта до декабря 2022 г. как «свыше ста тысяч» солдат.<ref name="Урсула 1" /> Потери польских наёмников за 9 месяцев спецоперации составили 1200 человек.<ref name="Поляки 1" /> Потери российской армии составили 5937 человек убитыми, заверил 21 сентября глава Минобороны РФ Сергей Шойгу в ходе интервью.<ref name="Шойгу 2" /> Украинская артиллерия в декабре стала испытывать "снарядный голод".<ref name="Снарядный голод 1" /> из-за трудностей доставки снарядов по железной дороге, эти трудности стали следствием ударов по украинским электростанциям. Руководство украинской железной дороги было вынуждено объявить о переводе некоторых маршрутов с электротяги на дизель. Украинская армия имела превосходство в количестве беспилотников в начале спецоперации, но к декабрю 2022 г. это превосходство было устранено российской армией. Разведывательные беспилотники наводят артиллерию на цель. Ударные беспилотники поражают цель, например танки и артиллерию противника. По словам президента Владимира Путина, конечной целью спецоперации является демилитаризация и денацификация Украины<ref name="Путин 1" />, жребий брошен и для осуществления этой цели Россия пойдёт до конца. Украинская пропаганда лжёт и устраивает провокации, западная пропаганда подхватывает эту ложную информацию в ходе психологической войны против России.
12 января 2023 г. группа Вагнер окружила украинские войска в г. Соледар. Российская армия захватила и зачистила этот город.<ref name="Соледар 1" />
===Попытки контрнаступления украинских войск и к чему это привело===
Весной 2023 года страны НАТО провели кампанию по переобучению украинских солдат и снабдили украинскую армию новыми образцами современного западного оружия. А российская армия продолжала приспосабливаться к этим новым видам западного оружия и училась уничтожать эти новые виды западного оружия и перемалывать украинскую армию. К маю 2023 года потери украинской армии превысили 300 тысяч солдат. <ref name="Потери 2" /> Запад решил воевать против России до последнего украинца. Российская армия научилась с помощью ракетных и артиллерийских ударов и атак беспилотников уничтожать склады с новейшим западным оружием, образцы новейших западных средств ПВО, артиллерии и скопления украинских войск, изготовившихся для атаки на российские позиции.
В ночь на 16 мая 2023 г. в Киеве высокоточным ударом гиперзвуковой ракетой «Кинжал» был поражен американский зенитный ракетный комплекс Patriot в Киеве. Оказалось, что этот зенитно-ракетный комплекс совершенно бессилен против гиперзвукового оружия.<ref name="Пэтриот 1" /> Британия передала Киеву дальнобойные ракеты Storm Shadow. Украинская армия получила ракеты, способные поражать цели на расстоянии в 250-300 километров. Под ударом теперь оказались все подконтрольные России регионы, весь Донбасс, почти вся территория Крыма – Севастополь, Симферополь, Белгород, Старый Оскол, Курск, Брянск, Воронеж, до Крымского моста британские ракеты не дотягиваются. Российские ПВО умеют сбивать эти британские ракеты, но весь фронт стопроцентно закрыть от этих крылатых ракет не получится, поэтому будут бреши, через которые противник будет пытаться прорваться. Для запуска ракет Storm Shadow нужны самолеты. <ref name="Shadow 1" /> Киев впервые применил крылатые ракеты Storm Shadow 12 мая 2023. Целью стал Луганск. Ракетный удар нанес украинский Су-24, который летел под прикрытием МиГ-29. Оба самолета в итоге были сбиты российской авиацией, но 2 британские ракеты достигли своей цели. <ref name="Shadow 2" />
Украинская армия придерживалась старой проверенной в 2022 году тактики прощупать линию оборону российской армии с помощью разрозненных атак десантно-разведывательных групп по всей линии фронта, обнаружить слабости в российской обороне и нанести решительный удар с применением танковых клиньев с целью рассечь линию российской обороны. Осенью 2022 года это хорошо получилось у украинцев при наступлении под Харьковом и Херсоном. Но в 2023 году российская армия построила мощные эшелонированные линии обороны и минные поля. К тому же в 2023 году в воздухе господствовала российская авиация, которая безжалостно уничтожала любые скопления украинской бронетехники, делая невозможным любые крупные контрнаступления украинской армии. Украинская армия имела планы окружить группу "Вагнер" в Бахмуте двумя фланговыми ударами и даже сначала имела небольшие успехи в этом направлении, но это наступление украинцев было остановлено. <ref name="Бахмут 10" /> В итоге, похоже, что у украинцев получается выполнить только первую часть своего плана - наносить разрозненные слабые удары с целью прощупывания российской обороны, совершать атаки с помощью беспилотников по Москве и Белгороду, но нанести рассекающие удары они не решаются.
13 мая 2023 года западнее украинского города Хмельницкого произошёл мощный взрыв, после которого образовался огромный "ядерный гриб" и якобы повысился радиационный фон. Как стало известно впоследствии, это случилось после удара России крылатой ракетой"Калибр" по складам с боеприпасами ВСУ в этом районе. Там могли храниться тысячи снарядов с обеднённым ураном, которые были поставлены Украине британцами для британских танков Challenger. Это вызвало страшную панику на Западной Украине и в Польше, хотя украинцы хотели "раскидать" этот обеднённый уран по территории Донбасса, чтобы вызвать "эпидемию" раковых заболеваний. Британцы хотели использовать эти снаряды, чтобы пробить броню российских танков.Глава Крыма Сергей Аксёнов отреагировал на угрозы наступления Вооружённых сил Украины (ВСУ) фразой "Ждём, встретим, похороним".
Британский институт оборонных исследований опубликовал доклад о плюсах и минусах российской армии после 1 года войны, о выводах из поражений:
* Российские батальонно-тактические группы страдали от недостатка пехоты, были перегружены техникой и были вынуждены отступать под напором многочисленной украинской пехоты, вооружённой автоматами и гранатомётами. Ответ русских состоял в увеличении количества специализированной пехоты, которая делится на три группы: "одноразовая", линейная и штурмовая. "Одноразовая" пехота, набранная из заключённых и мобилизованных ведёт непрерывные перестрелки с противником и выявляет узлы сопротивления и слабые места в обороне.Штурмовая пехота взламывает оборону и отводится после этого в тыл, а линейная пехота занимает отвоёванные позиции врага, ведёт оборону и подвергается обстрелам со стороны украинской артиллерии. Всё это позволяет снизить количество потерь среди подготовленной и самой ценной штурмовой пехоты, а наибольшие потери приходятся на подразделения "одноразовой" пехоты, которые изматывают противника.Всё это позволяет экономить время на обучение пехоты по стандартам штурмовиков.Самую высокую эффективность имеет российская морская пехота (она имеет самый лучший баланс между пехотой, артиллерией и бронетехникой), штурмовики "Вагнера" и народная милиция ДНР и ЛНР (они имеют боевой опыт). Российское ВДВ имеет недостаточное количество бронетехники. Русские сапёры показали высокую эффективность. Русские сапёры минируют местность и строят 3 линии укреплений. У русских существуют способы дистанционного минирования украинских тылов с помощью систем залпового огня "Земледелие".
* Российская бронетехника сегодня не идёт в самостоятельные атаки, не использует танковые клинья, а используется для поддержки атакующей пехоты.
* Сокращение интенсивности российского артиллерийского огня за счёт повышения его точности с помощью применения беспилотников "Орлан-10 для корректировки огня и снарядов "Краснополь" с лазерной наводкой. Российская артиллерия больше не стремится создавать "лунные" пейзажи и дробить щебёнку. Российские орудия часто меняют позиции, чтобы уйти от ответного огня. Большую роль играют дроны-камикадзе "Ланцет" в охоте на украинскую дальнобойную артиллерию.
* С осени прошлого года зенитчики начали выстраивать взаимодействие между комплексами С-300 и С-400 и комплексами малого радиуса действия "Тор" и "Панцирь-С". Получилась эшелонированная оборона, которая одинаково хорошо справляется и с уничтожением авиации на больших расстояниях, и с отражением комбинированных атак на сами комплексы ПВО, в том числе с применением противорадиолокационных ракет.Максимальная дистанция поражения украинского самолёта составила 150 км, при этом этот самолёт шёл на высоте всего 15 метров.Украинские лётчики превратились в одноразовых смертников. Жертвами русской системы РЭБ ежемесячно становятся около 10 тысяч украинских беспилотников.<ref name="Доклад 1"/>
Давно обещанное украинское наступление началось 4 июня 2023 года. Главный удар противник нанёс на южно-донецком направлении на Временском выступе. Украинское наступление закончилось безрезультатно и тяжёлыми потерями со стороны украинской армии. Министр обороны России Сергей Шойгу заявил, что вооруженные силы Украины (ВСУ) за три дня боевых действий потеряли более 3,7 тысяч боевиков и 52 танка. В ходе отражения украинского наступления погиб 71 российский военнослужащий, подбиты 15 российских танков.<ref name="Потери 5"/> Среди уничтоженной украинской бронетехники оказалось 8 немецких Леопардов и 3 французских колёсных танков. Российские вертолёты К 52 использовали против танков дальнобойные ракеты "Вихрь", способные поражать цели с расстояния 6-7 км. Находясь на таком удалении, вертолёт способен работать по целям, не заходя при этом в зону поражение тех же "Стингеров". <ref name="Леопард 1"/> Начальник Генерального штаба Вооруженных сил (ВС) России Валерий Герасимов находился на «передовом пункте» во время крупномасштабного наступления украинских войск на южно-донецком направлении.<ref name="Герасимов 3"/>
Второй удар украинская армия нанесла под городом Орехов ночью 8 июня 2023 г.. Четыре колонны бронетехники увязли в минных полях и были разгромлены ударами артиллерии, авиации, танков, термобарическими зарядами "Солнцепёков" и противотанковыми ракетами "Корнет" российской пехоты. <ref name="Орехов 1"/> Российская армия широко использовала системы дистанционного минирования "Земледелие". Система предназначена для оперативного создания минных полей на особо опасных направлениях на расстоянии от 5 до 15 км — она выстреливает реактивные снаряды, которые обеспечивают установку мин в заданном районе. Возможна укладка минных полей любой сложности, в том числе с проходами для своих войск. <ref name="Земледелие 1"/>
Президент России Владимир Путин заявил 16 июня 2023 г. на Петербургском международном экономическом форуме (ПМЭФ) об огромных потерях украинской армии во время украинского наступления - 186 танков и 418 бронемашин. Среди уничтоженных бронемашин особую ценность имеют немецкие танки Леопард и американские бронемашины "Бредли". <ref name="Контрнаступ 1"/> Российские предприниматели, певцы Николай Басков и Григорий Лепс пообещали платить российским военным по миллиону рублей за каждый подбитый танк Leopard. Первым эту денежную премию получил сибиряк Андрей Кравцов, который, по российским источникам, обошёл танк "Леопард" с фланга и подбил танк из гранатомёта, в этой схватке с танком герой Андрей Кравцов потерял половину руки и денежную премию он получил уже в госпитале. <ref name="Леопард 10"/> В случае появления этого танка на передовой российские солдаты начинают бить по этому танку из всех стволов. <ref name="Леопард 20"/>
По сообщениям министерства обороны России украинская армия потеряла за 10 дней неудачного контрнаступления 7500 своих солдат. <ref name="Контрнаступ 2"/> После неудачной попытки прорыва на танках и другой технике Украина перешла к многочисленным штурмам небольшими группами пехоты или к атакам пехоты волнами в течение нескольких суток. Эти "мясные" штурмы привели к большим потерям среди украинской пехоты. Украина стала беречь западную технику, так как фотографии потерь немецких танков "Леопард 2" и американских бронемашин "Брэдли" в западных газетах на первом этапе наступления стали антирекламой этих видов западной техники. Такая же судьба ждала бы и американские танки "Абрамс", в случае их поставки на Украину. Тогда возникает проблема, как можно продавать западную бронетехнику на мировом рынке после такой антирекламы? Негативные итоги контрнаступления за 1 месяц подвёл министр обороны Сергей Шойгу. Потери Украины с начала контрнаступления составили более 26 тысяч военных и трёх тысяч единиц различного вооружения. В частности, русскими военными было уничтожено: 21 украинский самолёт, 5 вертолётов, 1244 танка и другой бронетехники, в том числе 17 "Леопардов" и 12 БМП "Брэдли".Также он добавил, что на Краснолиманском направлении уже войска России предприняли контрнаступление. В результате российским войскам удалось продвинуться на 1,5 километра в глубину и на 2 километра по фронту. <ref name="Контрнаступ 10"/>В сентябре 2023 г. Президент В. В. Путин сказал, что "контрнаступ" не то что буксует, "это провал". По его словам, в попытках "любой ценой добиться результата" Украина потеряла 71,5 тысячу солдат. В числе 18 тысяч уничтоженных единиц техники ВСУ немецкие танки Leopard, французские AMX, как минимум один британский Challenger 2 и американские БМП Bradley. Только танков ликвидировано 543 – они должны были быть главной ударной силой ВСУ, но, как замечал российский президент, теперь "прекрасно горят".<ref name="Контрнаступ 11"/>
===Вооружённый мятеж Евгения Пригожина и частной военной компании "Вагнер"===
'''Причины конфликта:'''
* С весны 2023 года основатель ЧВК "Вагнер" Евгений Пригожин начал обвинять Министерство обороны РФ в коррупции и создании искусственного дефицита боеприпасов. В феврале Пригожину запретили вербовать заключенных.
* 10 июня 2023 г. министр обороны РФ Сергей Шойгу издал приказ, по которому все участники добровольческих отрядов до 1 июля должны заключить контракт с Министерством обороны. На это Пригожин ответил, что никто из бойцов "Вагнера" не пойдет "по пути позора".
* Днем 23 июня 2023 г. Пригожин завил, что СВО была "бездарно спланирована", президент Владимир Путин получал несоответствующие действительно отчеты о планах Украины и НАТО по нападению на Россию, а спецоперация была нужна для карьеры Шойгу и олигархов, желавших назначить Виктора Медведчука президентом Украины.
'''Повод для конфликта:''' вечером 23 июня 2023 г. Пригожин сообщил о ракетных ударах по лагерям ЧВК и обвинил в этом Министерство обороны РФ. В министерстве сообщение опровергли, но Пригожин сказал, что министр обороны Шойгу лично прибыл в Ростов, чтобы отдать приказ нанести удар по лагерям "Вагнера", а также, что ЧВК приняла решение расправиться с руководством Министерства обороны и будет уничтожать всех, кто появится на его пути. ФСБ квалифицировала заявление как призыв к вооруженному мятежу и призвала бойцов "Вагнера" задержать Пригожина, который в ответ сказал, что "это не военный переворот, а марш справедливости", а его "действия никак не мешают войскам".
'''Ход конфликта:''' 24 июня 2023 г. "Вагнер" зашел в Ростов-на-Дону, после чего Пригожин обвинил главу Генштаба Валерия Герасимова в отдаче приказа бомбить с самолетов колонны ЧВК. "Вагнер" берет под контроль штаб Южного военного округа, здания ФСБ, управления полиции и горадминистрации Ростова."Непомерные амбиции привели к измене" — утром 24 июня 2023 г. президент Путин выступил с таким обращением. Он назвал происходящее вооруженным мятежом, предательством и "ударом в спину" и пообещал, что виновные будут наказаны. Начались авиаудары по колоннам "Вагнера". Тем не менее они уже находились в Тульской области. 4-5 тысяч вагнеровцев (по сообщениям, во главе с командиром Уткиным) пробивались к Москве через расставленные на их пути заслоны из старых грузовиков.
'''Итог конфликта:'''Вечером 24 июня 2023 г. президент Белоруссии Александр Лукашенко провел переговоры с Пригожиным, в результате которых Пригожин заявил, что разворачивает свои вооруженные силы и уводит их в тыловые лагеря в обмен на гарантии для вагнеровцев. Согласно заявлению Дмитрия Пескова, уголовное дело против Пригожина закрывается, и он уезжает в Белоруссию по сути в ссылку, бойцы ЧВК "Вагнер" (теперь, очевидно, бывшей) освобождаются от уголовного преследования и продолжают служить, как того и требовал Шойгу, по контрактам с МО РФ, Шойгу и Герасимов остаются на своих постах. В результате боестолкновений погибли 15 российских военнослужащих, большая часть которых — члены экипажей семи подбитых авиабортов, среди которых самолет Ил-18 и ударный вертолет Ка-52 "Аллигатор".<ref name="Пригожин 1"/>
===Вызовы и ответы этой войны. Новое в военной науке===
Эта война внесла много нового в военную науку:
* Оказалось, что противотанковые средства сделали невозможными наступления с помощью танковых клиньев.
* Оказалось, что противовоздушная оборона сделала невозможным использование авиации над территорией противника. Но средства ПВО сами могут стать целью для гиперзвуковых ракет.
* Использование спутников и беспилотников для разведки, сделало невозможным сохранить в тайне накопление техники для танковых клиньев.Линия фронта стала прозрачной для противника. Использование беспилотников для корректировки артиллерийского огня и использование беспилотников-камикадзе заставило пехоту зарыться в землю, заставило маскировать технику, заставило артиллерию постоянно менять позиции, заставило пехотные части рассредоточится, заставило штабы и базы снабжения рассредоточиться, маскироваться, прятаться в бункеры, заставило вывести их из зоны поражения на безопасное расстояние.
* Началась гонка за более дальнобойную артиллерию в процессе контрбатарейной борьбы, когда менее дальнобойные системы вынуждены прятаться от более дальнобойных систем.
* Осложнилось использование дорогих авианосцев и крупных кораблей из-за использования против них дешёвых ракет и БПЛА. Примером может быть гибель крейсера "Москва".
* Изобретение средств позиционного минирования (типа российской системы "Земледелие" ) очень осложнило проведение наступления с помощью пехоты и танков.
Вывод: Произошёл позиционный тупик.Эта война стала позиционной как Первая мировая война и перестала быть маневренной, как Вторая мировая война. Началась война на истощение. Выходом из этого позиционного тупика могут стать изобретение активной защиты для танков, использования планирующих бомб, чтобы авиация могла наносить удары с безопасного расстояния, использование гиперзвуковых ракет для поражение крупных средств ПВО, например российская гиперзвуковая ракета "Кинжал" поразила американский зенитно-ракетный комплекс Patriot. Использование украинцами противотанковых ракет FGM-148 Javelin, которые бьют в крышу танка, заставило российских танкистов приваривать с помощью сварки самодельные "мангалы" из сетки и арматуры на крышу танка. Против беспилотников стали использовать средства радиоэлектронной борьбы.Все эти технические средства могут позволить найти выход из позиционного тупика и снова сделать войну маневренной.
=== Переход инициативы на фронте в руки России===
Вооруженные силы Украины завершают наступательные операции и переходят к стратегической обороне.Об этом заявил президент Украины Владимир Зеленский 1 декабря 2023 г. Зеленский собирается строить укрепления от Донбасса до Западной Украины. Тем самым Зеленский признал крах летнего наступления ВСУ. Инициатива на фронте перешла к российским войскам.<ref name="Оборона 1" /> 12 декабря 2023 г. российские войска освободили Марьинку. Этот пригородный посёлок использовался ВСУ для обстрела Донецка <ref name="Марьинка 1" /> Инициатива на фронте перешла к российской армии.
8 февраля 2024 г. президент Украины Зеленский отправил в отставку главнокомандующего Валерия Залужного и назначил на его место Александра Сырского. Причиной отставки Залужного стало то, что рейтинг популярности генерала Залужного на Украине - 88%, намного выше, чем у президента<ref name="Залужный 1"/>, то есть главной причиной отставки стала зависть президента к генералу. Борьба внутри руководства Украины после неудач на фронте выгодна для России.
К марту 2024 г. были потоплены или повреждены больше 15 кораблей и катеров российского Черноморского флота, например, большой десантный корабль "Новочеркасск" был атакован и потоплен ракетами Storm Shadow англо-французского производства, ракетный катер "Ивановец" и большой десантный корабль "Цезарь Кунников" были потоплены морскими дронами Magura V5. <ref name="Флот 2" /> К марту 2024 г. было потеряно 20% от численности Черноморского флота. С должности командующего Черноморским флотом России был снят адмирал Виктор Соколов. Новым командующим Черноморским флотом назначен вице-адмирал Сергей Пинчук.<ref name="Флот 3" /> Адмирал Александр Моисеев стал врио главкома ВМФ<ref name="Флот 5" />. В ночь на 5 марта 2024 г. около рейда Феодосии был потоплен патрульный корабль «Сергей Котов». Он схватился в бою с бесэкипажными катерами (БЭК) врага, которые атаковали его в массовом порядке. За атакой БЭК стоит скорее всего британская Special Boat Service (SBS). В ответ был нанесён удар российской ракетой "Искандер" по портовым сооружениям Одессы, в результате был ликвидирован ангар с безэкипажными катерами, а также несколько британских спецназовцев. Мало того, незадолго перед ударом в порту побывал сам президент Украины Зеленский в компании премьер-министра Греции Кириакоса Мицотакиса. <ref name="Флот 4" /> В октябре 2023 г. Черноморский флот России был выведен из Севастополя, главным образом, в Новороссийск и Черноморский флот РФ рассредоточен в том числе в Феодосии (Крым), Азовском море и Абхазии (в Очамчирской бухте). Рассредоточение флота во время войны - это закономерный процесс во время войны, так как этот процесс позволяет контролировать всё побережье и исключает возможность для противника уничтожить флот одним ракетным или авиационным ударом. При этом российские корабли по-прежнему могут наносить удары крылатыми ракетами Калибр по инфраструктуре Украины. Основоположник теории "морского могущества" адмирал Альфред Мэхэн в "Войне 1812 года" настаивал, что все силы флота во время войны должны гармонично распределяться вокруг стратегического центра, охватывая максимально возможную площадь и сохраняя гибкую связь для быстрого реагирования. <ref name="Флот 6" /> Черноморский флот научился бороться с нападениями украинских безэкипажных морских катеров-камикадзе в 2024 году с помощью использования вертолётов. Наиболее эффективным средством против БЭК является пулемет в двери вертолета.<ref name="Вертолёт 1" /> За первую неделю 2025 года российская армия потеряла 3 вертолёта и 8 пилотов в результате боя вблизи Севастополя с украинскими безэкипажными катерами Magura V5, оснащёнными ракетами Р-73 SeeDragon c инфракрасной головкой самонаведения. На Херсонщине вражеский БЭК атаковал FPV-дроном позиции ЗРПК "Панцирь". Беспилотник запустили с катера без экипажа. Все разработки украинцев по созданию БЭКов ведутся под патронажем британских спецслужб. Для российского флота это серьёзная проблема, у которой пока нет решения. Российская авиация может уничтожать украинские БЭКи только днём и в хорошую погоду с использованием реактивной авиации, штурмовиков и истребителей. <ref name="Флот 7" /> 1 февраля 2025 г. украинский БЭК Magura V5 был уничтожен российским воздушным беспилотником Орион (Иноходец) с помощью ракеты ТКБ-1030 с лазерным наведением во время атаки в Черном море.Этот дрон создан для разведки и длительного патрулирования, для уничтожения танков противника в любое время суток. Дрон может нести четыре ракеты класса «воздух — поверхность». «Комбинация „Ориона“ и ТКБ-1030 позволяет поражать цели с относительно безопасной дистанции. Но точно так же вражеские катера можно уничтожать вертолетами с управляемыми ракетами, просто модернизация машин под такие боеприпасы у нас вовремя не проводилась. <ref name="Орион 1" /> При защите Крыма был потоплен безэкипажный украинский катер Magura V7 с помощью российского воздушного беспилотника-камикадзе ZALA «Ланцет». <ref name="Ланцет 2 "/> В ночь на 28 августа российский безэкипажный катер (БЭК) Черноморского флота впервые потопил средний разведывательный украинский корабль «Симферополь» в устье Дуная. Безэкипажный катер стоит дешевле, чем сверхзвуковая противокорабельная ракета. Русские научились производить и применять безэкипажные катера не хуже британской разведки. <ref name="БЭК 1 "/>
15 февраля 2024 г. Белгород подвергся очередному обстрелу со стороны ВСУ в разгар дня. Ракетный удар в Белгороде пришелся на торговый центр, а также стадион школы №42. На школьном стадионе - гуляли дети и бабушка с коляской...В результате ракетного удара 6 человек погибли, 17 ранены. Среди погибших и пострадавших при обстреле Белгорода были дети, в том числе погиб 4-месячный младенец. Ракетный удар был нанесён с украинскими нацистами с помощью чешской РСЗО RM-70 Vampire. Средства противовоздушной обороны сбили 14 реактивных снарядов, но не все. Чтобы избежать в будущем подобных ударов и террористических актов, нужно отодвигать линию фронта подальше от Бедгорода и громить врага без всякой пощады.<ref name="Белгород 2" />
Наступательная операция Вооруженных сил РФ в Авдеевке началась в октябре 2023 года. Расположение Авдеевки (13 километров к северу от Донецка) позволяло украинским нацистам вести обстрелы мирных жителей Донецка из ствольной артиллерии, в то время как на других направлениях позиции ВСУ значительно более удалены от Донецка. Украинцы построили мощные подземные укрепления из железобетона в Авдеевке, которые были разрушены с помощью мощных управляемых авиабомб весом до 1500 кг. Сначала удалось взять Авдеевку в клещи, затем российская армия разрезала город на 2 части и взяла под свой контроль последнюю хорошую дорогу (Индустриальный проспект), служившую путем снабжения гарнизона ВСУ в Авдеевке. <ref name="Авдеевка 2" /> Оборона в Авдеевке была взломана с помощью заброшенной подземной трубы, проложенной для отвода сточных вод длиной 3 км и высотой 1,5 метра. Эта труба вела в тыл противника. Российские солдаты расчистили её от грязи и ледяной воды и затем они пробрались по этой трубе в тыл противника, появились из-под земли, атаковали в спину и захватили опорный пункт противника - турбазу "Царская охота" и дачный посёлок "Виноградники", а затем 6 дней оборонялись от ожесточённых украинских контратак.<ref name="Труба 1" /> Сырский сначала хотел прорвать окружение в Авдеевке и перебросил свежие резервы - 3 штурмовую бригаду (бывший полк "Азов"). Армия России обстреляла военный полигон ВСУ в Селидово (в 30 километрах от Авдеевки) ракетами "Искандер" с кассетной боеголовкой, потери ВСУ составили примерно 1,5 тысячи человек, под удар попала именно 3 штурмовая бригада. <ref name="Авдеевка 4" />. 17 февраля Главком ВСУ Александр Сырский приказал украинским подразделениям оставить Авдеевку и отступить, но не все украинские солдаты смогли выполнить этот приказ и оказались в окружении. <ref name="Авдеевка 3" /> Среди «запертых» в городе - нацисты из полка «Азов». Многие из них, по аналогии с Мариуполем, сидели в подвалах крупнейшего предприятия города – Коксохимического комбината, но затем в панике сбежали из окружения. <ref name="Авдеевка 5" /> Украинские войска начали в панике бежать из Авдеевки за сутки до приказа Сырского об отступлении.<ref name="Авдеевка 6" /> Операциями по освобождению Мариуполя и Авдеевки руководил генерал Андрей Мордвичёв.<ref name="Мордвичёв 1" /> В войсках молодой генерал (49 лет) Мордвичёв имеет прозвище "генерал-прорыв", "мастер штурмов".. В войсках Мордвичёва действительно уважают. Это не паркетный, а окопный генерал. Военные эксперты называют его мастером штурмов. При нём начали применять тактику захода в тыл врага под землёй по трубе.15 мая 2025 г. Андрей Мордвичёв был назначен главнокомандующим Сухопутными войсками Вооруженных сил (ВС) России. <ref name="Мордвичёв 2" /> Вместо Мордвичёва командующим «Центром» и Центральным военным округом стал генерал Валерий Солодчук, руководивший штурмом Суджи. Генерал Мордвичев напоминает нового маршала Победы Жукова? <ref name="Мордвичёв 3" /> В начале сентября 2025 г. генерал Мордвичёв был назначен первым заместителем начальника Генерального штаба Герасимова. Военные эксперты уверены, что его назначение радикально изменит ход СВО. Больше не будет сказочных отчетов о взятии деревень в три улицы. ВС РФ явно готовятся к большим операциям по уничтожению к крупных укрепрайонов и Мордвичёв идеально подходит в качестве их планировщика и командующего.<ref name="Мордвичёв 4" />
Российские войска на Авдеевском направлении сожгли уже 3 танка M1A1 Abrams из 31 полученных американских танка, 1 шведскую САУ Archer, а ракетчикам удалось накрыть 3 неуловимых реактивных систем залпового огня HIMARS в глубоком тылу противника.Это была настоящая охота. Актер Иван Охлобыстин пообещал 10 миллионов рублей за уничтожение первого танка Абрамс. В итоге бойцы 15-й отдельной мотострелковой бригады обездвижили танк точным попаданием FPV-дрона в моторное отделение и добили его вторым дроном в самое уязвимое место танка - кормовую нишу башни, где хранятся снаряды. Первый танк Абрамс записал на свой счёт боец с позывным Рассвет. Другие уязвимые места танка Абрамс - это гусеницы или место под башней, по которым пехотинец может ударить из ручного гранатомёта. Экипаж танка Т-72Б3 одержал верх в танковой дуэли с третьим Абрамсом. "Абрамс" был уничтожен управляемой ракетой "Инвар", запускаемой из канала ствола российского танка, у американцев нет в арсенале такой ракеты, которая может поражать противника даже в лобовую броню на расстоянии больше на 1 километр, чем обычный противотанковый снаряд.
У российской армии есть огромная проблема в контрбатарейной борьбе - западная артиллерия пока превосходит российскую артиллерию по дальнобойности. Решить отчасти эту проблему помогает российский беспилотник "Ланцет". Именно этим беспилотником впервые была уничтожена неуловимая шведская САУ Archer.При скорострельности восемь выстрелов в минуту она способна выпустить три снаряда на максимальную дальность в 40 километров, свернуться и покинуть огневую позицию до того, как первый снаряд долетит до цели. В рамках гонки за более дальнобойную артиллерию Россия в начале 2024 г. начала применять САУ Коалиция СВ калибра 152 мм. Эти «самоходки», получившие прозвище «Зверь», были созданы на шасси танка Т-90, они имеют орудие 2А88, со скорострельностью 19 выстрелов в минуту и максимальной дальнобойностью в 70 км, боекомплект пушки - 70 управляемых снарядов, созданных на основе снарядов «Краснополь». Коалиция СВ - это боевой робот. Экипаж - 3 человека, который размещён в бронированной капсуле, как в танке Т 14 Армата. Применение автомата заряжания позволило освободиться от двух заряжающих, а башню сделать полностью необитаемой. <ref name="Коалиция 1" /> Начало боевого применения САУ Коалиция СВ призвано внести решающий перелом в контрбатарейную борьбу» в зоне СВО.
Для сравнения:
* Дальнобойность шведской САУ Archer - 60 км.
* Дальнобойность польской САУ Krab - 40 км.
* Дальнобойность немецкой САУ Panzerhaubitze 2000 - 50 км.
* Дальнобойность французской САУ CAESAR - 54 км.<ref name="Коалиция 2" />
* Дальнобойность американской САУ Paladin при использовании снаряда Excalibur - 40 км.<ref name="Paladin 1" />
На фоне очевидных проблем с поточным производством российских САУ Коалиция СВ весьма полезным оказалась помощь Северной Кореи в поставках в Россию северокорейского оружия для контрбатарейной борьбы:
* САУ M1989 Koksan имеет калибр 170 мм, дальнобойность обычными снарядами на 40 км, а дальнобойность активно-реактивными снарядами - на все 60, а то и 70 км, скорострельность - 2 выстрела в минуту, возимый боекомплект - 12 снарядов.<ref name="Коксан 1" />
* РСЗО М-1991 можно использовать против американских Хаймарсов. Калибр северо-корейской РСЗО - 240 мм. Дальнобойность северокорейской РСЗО составляет 60 км. <ref name="РСЗО 1" />
Российские войска поразили HIMARS в 40 км от линии фронта. Успешная атака говорит о том, что российские войска применяют дроны, способные оперативно наводить на цели высокоточное оружие и вести объективный контроль результатов стрельбы на столь дальних дистанциях. Российские войска успешно применяют ракетные установки "Искандер-М" или РСЗО "Торнадо-С" для уничтожения HIMARS. <ref name="Абрамс 1" /> Российские артиллеристы уничтожили одним ударом ракеты «Искандер-М» два американских кочующих зенитно-ракетных комплекса Patriot около г. Покровск на расстоянии 50 км. от линии фронта. Эти кочующие установки Patriot охотились за российскими самолётами, которые сбрасывают управляемые авиабомбы (КАБ) из-за линии фронта, поэтому эти самолёты трудно уничтожить. Это и заставляет украинцев приблизить слишком близко к линии фронта свои зенитно-ракетные комплексы. Установки Patriot были обнаружены с помощью российского беспилотника, которые зафиксировал и их уничтожение прямо на марше во время остановки.<ref name="Пэтриот 11" /> Именно ракетой из такого кочующего зенитно ракетного комплекса Patriot был ранее сбит российский военно-транспортный самолёт Ил-76 с 65 украинскими военнопленными, 6 членами экипажа и 3 сопровождающими на борту, украинские военнопленные были предназначены для обмена на российских военнопленных. <ref name="Пэтриот 12" />
21 февраля 2024 г. министр обороны Сергей Шойгу доложил президенту Владимиру Путину о ликвидации украинского плацдарма в Крынках на правом берегу Днепра на Херсонском направлении. С этого плацдарма украинцы планировали наступать на Крым и пытались перебрасывать резервы и боеприпасы на лодках через Днепр, при этом украинцы несли огромные потери. <ref name="Крынки 1" />
12 марта 2024 г. диверсионные группы Русского добровольческого корпуса предприняли попытки прорваться в Белгородскую область России. Цель диверсантов - помешать выборам на пост президента России. Но эти попытки диверсантов были пресечены на границе российской армией. Потери диверсантов за март составили около 2 тысяч боевиков. <ref name="Белгород 3" /> Выборы президента РФ проходили с 15 по 17 марта 2024 г. По официальным данным на этих выборах победил Владимир Путин. Он набрал 87,28% голосов избирателей. В выборах приняло участие 77,49% избирателей. Эти результаты стали рекордными в истории современной России. Российский народ выразил поддержку политике президента Владимира Путина на Украине. <ref name="Выборы 1" />
Террористический акт в «Крокус Сити Холле» на окраине Москвы произошёл 22 марта 2024 года. Нападавшие террористы открыли огонь по находившемся в здании зрителям, подожгли зрительный зал, а затем покинули здание и скрылись на автомобиле. В результате атаки погибли не менее 144 человека и 551 человек получил ранения. В результате взрывов и пожара здание концертного зала было почти полностью разрушено. Террористы пытались скрыться на территории Украины для получения обещанного им вознаграждения, но были арестованы за 100 км от границы. 4 исполнителя теракта были задержаны в Брянской области в результате полицейской операции. Автомобиль с террористами не остановился по требованию силовиков и попытался скрыться. В ходе преследования была открыта стрельба, машина перевернулась, террористы были пойманы в лесу и арестованы. Террористами оказались мигранты, граждане Таджикистана. <ref name="Теракт 1" />
Возмездием за террор в «Крокус Сити Холл» и в Белгороде стали удары Российских Вооружённых Сил по центрам принятия решений на Украине (а именно по зданиям Службы безопасности Украины СБУ и Главного управления разведки ГУР) и по объектам электрогенерации (по электростанциям) с помощью гиперзвуковых ракет Циркон. В Киеве были разрушено одно из зданий ГУР и СБУ, уничтожены 2 ЗРК Patriot в аэропорту Жуляны. <ref name="ГУР 1" /> Если раньше Российские ВС били по трансформаторам, которые можно быстро восстановить, то теперь стали бить по машинным залам , где расположены генераторы, которые трудно восстановить. Например, был разрушен машинный зал на Днепровской ГЭС в Запорожье. <ref name="ДнепроГЭС 1" /> Польские СМИ сообщили о внезапной гибели бригадного генерала польской армии Адама Марчака. Согласно непроверенной информации, генерал погиб в результате поражения украинского командного пункта, расположенного глубоко под землёй, ударом российской баллистической ракеты "Искандер" в районе Часова Яра. <ref name="Марчак " />
Планирующая авиабомба состоит из старой авиабомбы весом 500 или 1500 килограммов с крыльями и блоком наведения. И обычный «чугуний» (как называют летчики, к примеру, бомбу ФАБ-500) превращается в мощнейший высокоточный боеприпас, который самолеты запускают с огромной высоты, не входя в зону действия ПВО противника. Это тебе не украинский квадрокоптер с гранатой. Этих мощных авиабомб есть очень много на складах в России. Объектами поражения для планирующих авиабомб прежде всего становятся украинские мосты, средства ПВО, узлы обороны и так далее. На линии фронта Российские ВС стали широко использовать самые мощные виды бомб - ФАБ 1500, ОДАБ 1500 и мощные кассетные бомбы, которые позволяют сметать с лица земли железобетонные укрепления и узлы управления, уничтожать и наводить ужас на живую силу противника. ОДАБ 1500 - это "вакуумная" или объёмно-детонирующая "царь-бомба", мощнее неё является только атомная бомба. Сначала происходит разбрызгивание аэрозольной смеси, а затем подрыв, при этом аэрозольная смесь проникает во все щели подземных бункеров, где выгорает всё живое. При этом все эти полуторатонные бомбы снабжены УМПК - унифицированным модулем планирования и коррекции со спутниковым наведением и с крыльями, раскрывающимися в полёте, поэтому российские бомбы стали планирующими и точными с отклонением не более 5 метров от цели. УМПК позволяет наносить удары точно по бункерам, а не по площадям, из зоны, недосягаемой для ПВО противника за 40-70 км от цели, а если снабдить бомбу реактивным двигателем, то дальность достигает 150 км. Эти бомбы повышенной дальности с реактивным двигателем появились на вооружении российской армии осенью 2025 года, их вес - 500 кг, дальность - около 200 км. <ref name="Бомба 200 км" /> Этих фугасных бомб образца 1954 года на российских складах хранится огромное количество. При взрыве боеприпас оставляет воронку диаметром 15 метров, радиус поражения ударной волной и осколками составляет 500 метров. В июне 2024 г. российские ВС впервые применили авиабомбу ФАБ 3000 в Липцах.<ref name="Бомба 3000" /> Эти бомбы стали настоящим ужасом для ВСУ - прилет их всегда неожиданный и тихий, а эффект, по словам украинских военнослужащих, поистине адский. В подземных железобетонных бункерах украинские солдаты погибают, получают контузию или пожизненный испуг от этого летающего дьявола. <ref name="Бомба 1500" />
===Переход России в наступление по всем фронтам===
Тактика ВС РФ - это тактика тысячи порезов. Это тактика "прощупывания почвы", когда ты бьёшь в разных местах в разное время, заставляя своего противника постоянно перебрасывать резервы из одного края в другой. Либо растягиваешь силы противника везде и уже для парирования следующего удара у противника нет сил, и его оборона рушится. Командование ВСУ перебросило все резервы со всех фронтов на север Харьковской области для отражения главного направления российской атаки и тем самым командование ВСУ оголило другие фронты, где Российские вооружённые силы стали успешно продвигаться и захватывать украинские сёла и города.
* 15 мая 2024 г. Минобороны РФ официально объявило об освобождении села Работино в Запорожской области.<ref name="Работино 1" />
* Наступление Российской армии от Бахмута к Часову Яру Донецкой области. Есть 2 трудности при штурме Часова Яра - это канал "Северский Донец – Донбасс" шириной от 30 до 40 метров, глубиной больше 6 метров и городские укрепления противника.<ref name= " Часов Яр 1" />
* Прорыв в Очеретино к северу от Авдеевки, после этого начались несколько наступлений российской армии в разные стороны от Очеретино как лепестки цветка.<ref name= " Очеретино 1" />
* Наступление российской армии на севере Харьковской области на границе с Белгородской областью. Цель российской армии - создать буферную зону с целью прекратить террористические обстрелы мирного населения Белгорода со стороны украинской армии. Российская армия вступила в города Липцы и Волчанск на глубину 10 км. от границы.<ref name= "Волчанск 1" />
* Наступление на Красногоровку (пригород Донецка), откуда украинские террористы раньше обстреливали мирное население Донецка из ствольной артиллерии.<ref name= " Красногоровка 1" />
* Наступление в направлении г. Купянска. Русская армия выбивает противника из села Берестовое<ref name= " Купянск 1" />
* Подразделение "Ахмат" ВС России заняло село Рыжевка, по сути начав заход в Сумскую область.<ref name= " Сумы 1" />
В результате украинская армия стянула все свои резервы в Харьковскую область под Волчанск и Липцы и развернула контрнаступление, которое окончилось провалом, а в это время российская армия нанесла основной удар на Донецком фронте, где украинская армия была ослаблена выводом резервов в Харьковскую область. Операция российской армии в Харьковской области - это классический отвлекающий манёвр. Резервы украинской армии под Харьковом были уничтожены, в значительной степени, с помощью ФАБов. А в это время российские войска захватили Красногоровку, из которой украинские войска обстреливали Донецк. В Харьковской области украинские войска были отодвинуты от границы с Белгородской областью на 15 км, что позволило создать буферную зону и снизить количество обстрелов Белгорода. <ref name= " Волчанск 2" />
В российском обществе росло недовольство деятельностью министра обороны Сергея Шойгу который даже никогда не проходил срочную службу в армии и имеет низкую военную квалификацию. Острой критике его подвергал ещё покойный Евгений Пригожин, который погиб в авиакатастрофе 23 августа 2023 года. 12 мая 2024 г. Сергей Шойгу был официально отправлен в отставку с поста министра обороны, по указу президента эту должность занял бывший заместитель председателя правительства Андрей Белоусов. Сам Шойгу стал секретарём Совета Безопасности. 2 его заместителя из министерства обороны - Тимур Иванов и Юрий Кузнецов - были арестованы по обвинению в коррупции. Другие заместители Шойгу ушли в отставку.Цель Белоусова - вычистить Министерство обороны от взяточников, от нечистых на руку дельцов и дать дорогу талантливым полководцам в Министерство обороны и Генеральный штаб, наладить производство нового эффективного оружия, контролировать рачительное использование возросших денежных потоков, вложенных в военно-промышленный комплекс .<ref name= " Белоусов 1" />
Во время атаки 23 июня 2024 г. на Севастополь погибло четыре человека, в том числе двое детей, пострадали больше сотни людей. ВСУ выпустили по городу пять ракет ATACMS с кассетными боевыми частями производства США. Четыре из них сбила наша ПВО, а пятая отклонилась от траектории полёта и взорвалась неподалёку от городского пляжа. Москва возложила ответственность за случившееся на США, которые поставляли ракеты Киеву. Информацию с полётными заданиями для ударов по целям на нашей территории американцы передают после работы разведки с помощью беспилотников Global Hawk и "Reaper" акватории Чёрного моря. 25 июня 2024 г. Global Hawk находился в нейтральных водах. Рядом с ним оказался и наш МиГ-31, который, не открывая огонь, сделал 2 захода на цель, после чего американская разведка передумала выполнять своё полётное задание в этом районе, собирая информацию для ударов ВСУ, и американский беспилотник отбыл восвояси. После этого глава Пентагона Ллойд Остин позвонил министру обороны России Андрею Белоусову. Детали разговора неизвестны. Белоусов потребовал у Генерального штаба решить проблему американских беспилотников над Чёрным морем. После инцидента с Global Hawk американцы на какое-то время перестали отправлять свои беспилотники вынюхивать информацию у русских границ. Зато фиксируется запредельная активность разведывательной авиации с экипажами. Пентагон рассудил, что на этот раз русские не шутят и действительно начнут сбивать их беспилотники над чужой территорией, а вот самолёты-разведчики с живым экипажем трогать не станут. <ref name= "Беспилотник 1" />
===Вторжение украинских войск на исконно русскую территорию России в Курской области и быстрое наступление российских войск на Донбассе===
Это вторжение произошло 6 августа 2024 г. в Сунжанском и Кореневском районах Курской области. Удар был неожиданным для российской армии. Приграничный район был слабо прикрыт пограничниками и военнослужащими срочной службы с одним стрелковым вооружением без тяжёлой военной техники, которые самоотверженно сражались с превосходящими силами противника, выходили из окружения и вновь вступали в бой. Кто-то из них погиб, кто-то оказался в плену, но свою задачу они выполнили. Позднее 115 пленных российских "срочников" были обменены на такое же количество украинских пленных.<ref name= "Пленные 1" /> Передовые украинские части вторжения на танках, БТР и бронемашинах, казалось бы, реализовывают некое подобие современного авантюристического плана "Барбаросса" — вперед сразу укатили мобильные группы на пикапах, которых в небе прикрывали как разведывательные, так и ударные беспилотные системы. Это ошибка Начальника Генерального штаба Российской армии Валерия Герасимова. Путин вызвал Герасимова для отчёта на Совет безопасности и взгляд Путина был очень злым. Герасимов обещал исправить положение в короткие сроки. Взгляд Путина означал, что виновные будут наказаны. <ref name= "Курск 1" /> План украинской операции, составленный Сырским состоял в следующем. 3 бригады должны были захватить перекрёсток дорог западнее г. Суджа, а затем, разделившись на отдельные бригады, по автомобильным дорогам колоннами быстро двигаться по нескольким направлениям, обходя узлы сопротивления:
* на Суджу. Эта колонна захватила Суджу и была остановлена.
* на Рыльск. Эта колонна была остановлена и разбита у Коренева на половине дороги до Рыльска, затем она отступила к перекрёстку дорог у Суджи.
* на Льгов и Курчатов. В г. Курчатов расположена Курская атомная станция. Продвижение украинской армии остановлено около г. Курчатов.Захват Курской атомной станции и последующий атомный шантаж был главной целью украинского плана.
Цель этого плана - захватить как можно больше территории.Безопасность украинских колонн с воздуха обеспечивали невиданное количество ПВО и РЭБ. Это РЭБ нарушило связь между подразделениями российской армии, что вызвало неразбериху и панику в первый день украинского наступления.
Ситуация начала выправляться лишь после полудня 9 августа за счёт подошедших резервов, в том числе российских спецназа "Аид", "Дикая дивизия Донбасса", "Пятнашка, "Русичи" и "Ахмат". А ВСУ меж тем стягивали под Курск новые эшелоны. По украинским резервам активно работают российская авиация и артиллерия. Среди украинских солдат замечены натовские специалисты и грузинские наёмники. Военные корреспонденты увидели в выступлении начальника российского Генштаба уже не просто ошибки, а череду лжи.<ref name= "Курск 2" />
Президент Владимир Путин назначил Алексея Дюмина главой Контртеррористической операции в Курской области. В условиях навязанной нам противником в Курском приграничье маневренной войны, необходимо более активно применять подразделения специальных операций и разведки ВДВ. Это их стихия: засады, огневые налёты, рейды по тылам. <ref name= "Дюмин 1" /> Украинские солдаты и иностранные наёмники совершали против мирного населения России военные преступления: расстреливали в упор мирных жителей, беременных женщин и уничтожали дронами автомобили с мирными жителями, которые пытались спастись и выехать с оккупированной территории. <ref name= "Пленные 1"/> В Брянской, Курской и Белгородской областях в ночь на 10 августа ввели режим контртеррористической операции (КТО). Ввод режима КТО означает, что «в случае проникновения на территорию области ДРГ ВСУ или же регулярных войск у всех силовых структур развязываются руки на применение крайних мер», в том числе в отношении «ждунов с любителями снять на камеру происходящее».<ref name= "КТО 1" /> Дмитрий Рогозин призвал не брать в плен напавших на Курскую область боевиков ВСУ и иностранных наёмников, приравняв их к террористам. <ref name= "Рогозин 1" /> На 25 августа 2024 г. потери ВСУ в Курской области составили 5500 солдат, 71 танк, 3 американских РСЗО HIMARS 1 MLRS и т. д.<ref name= "Курск 3" /> В целом, ВСУ так и не смогли перейти к полноценному прорыву и до конца вынуждены были имитировать глубокое проникновение малыми группами, в то время как основные силы пытались закрепиться в приграничной полосе, глубиной до 15 км и шириной до 40 км. Вся украинская группировка висела на одной дороге, сбившись в кучу на небольшом плацдарме. Вся логистика ВСУ (от подхода резервов, до эвакуации раненных) оказалась под ударами ВКС РФ, РСЗО и артиллерии. Эта авантюра стала ловушкой или капканом для украинской армии, огненный мешок по дороге смерти, фолом последней надежды – попыткой выиграть приемлемый мир, несмотря на военное поражение.Грубо говоря, Киеву надо быть достичь такой ситуации, в которой он выигрывал бы на курском направлении быстрее, чем проигрывает на Донбассе. <ref name= "Капкан 1" /> 10 сентября 2024 г. российские войска нанесли контрудары с флангов по украинскому плацдарму в Курской области с запада и востока с угрозой окружения противника. Этот первый этап контрнаступления за 2 дня привёл к освобождению 10 населённых пунктов из 28 оккупированных населённых пунктов Курской области. <ref name= "Курск 4" /> Затем украинские войска подтянули резервы и нанесли контрудар во фланг наступающей российской группировке с территории Украины у села Весёлое. Этот украинский контрудар был успешно отбит российскими войсками.<ref name= "Курск 5" /> Затем 10 октября российские войска начали второй этап контрнаступления, российские войска окружили украинские войска в селе Любимовка и взяли под контроль дорогу Суджа-Коренево. Всего с начала российского контрнаступления было освобождено 19 населённых пунктов.<ref name= "Курск 6" /> 20 ноября 2 тысячи украинских солдат были окружены и уничтожены в Ольговской роще на севере курского плацдарма украинской армии <ref name= "Курск 7" />
5 января 2025 года Украинские войска, используя бронетехнику, предприняли три атаки на хутор Бердин и посёлок Новосотницкий на Курском выступе, как "наступления последней надежды”, чтобы навязать России более приемлемые условия мира. Эти атаки захлебнулись. Украинские подразделения, которые зацепились за эти населённые пункты, были уничтожены или сдались в плен. Украинцы использовали мощные комплексы РЭБ, но украинская бронетехника была сожжена с помощью дронов на оптоволокне, артиллерии и авиации. Комплексы РЭБ не влияют на работу дронов на оптоволокне. Российская разведка все знала и эффекта внезапности у киевского режима не получилось. В ответ Российские войска нанесли два контрудара на флангах с целью окружить курский выступ противника в Судже. На западном фланге 6,7,8 января 2025 г. российские войска освободили или вели бои за Русское Поречное, Новая Сорочина, Малая Локня, Викторовка, Леонидово, Погребки, Николаево-Дарьино. Это был прорыв на 10 км.за сутки. На восточном фланге курского выступа российские войска освободили или вели бои в районе Махновки около Суджи. Украинская армия придерживалась тактики активной обороны <ref name= "Курск 8" /> 17 февраля 2025 года российские войска освободили приграничное село Свердликово на западном флаге горловины, которая соединяет оккупированную Суджу с Украиной. Затем российские войска стали расширять прорыв, вошли на территорию Украины и захватили сёла Журавка, Басовка, Новенькое. Этот прорыв позволил взять под огневой контроль единственную дорогу с асфальтовым покрытием между Суджей и Украиной, чтобы прервать снабжение украинских войск в Судже, что поставило эти войска под угрозу полного окружения. От Свердликово до этой дороги осталось всего 7 километров. Эта дорога превратилась для бандеровцев в дорогу смерти. <ref name= "Курск 9" /> 8 марта 2025 года российская армия начала операцию по окончательному освобождению Судженского района Курской области. Это освобождение началось с операции "Поток" ("Труба"). Через трубу газопровода Уренгой – Помары – Ужгород около более 600 российских штурмовиков прошли 15 километров вглубь обороны украинской армии в противогазах и с кислородными баллонами. Предварительно из трубы был откачан метан, но остатки этого газа сохранились в трубе, поэтому некоторые российские штурмовики получили отравление. Диаметр трубы 1,4 метра. Появление российских штурмовиков из трубы в тылу врага вызвало панику среди украинских солдат. На выручку десанту со всех сторон курского выступа поспешили отряды российских штурмовиков. В оперативном окружение изначально попало порядка 10 тысяч солдат ВСУ. Оборона украинской армии в Курской области стала рассыпаться, украинские солдаты в панике стали прорываться из окружения и в панике бежать. В результате удара российской армии территория украинского плацдарма в Курской области была рассечена пополам с запада на восток по методу дробления окружённой группировки. 12 населенных пунктов Курской области: Агроном, Богдановка, Бондаревка, Дмитрюков, Зазулевка, Ивашковский, Колмаков, Кубаткин, Мартыновка, Михайловка, Правда, Южный, Малая Локня. <ref name= "Курск 10" /> 13 марта 2025 г. российская армия освободила районный центр Курской области г. Суджа. 12 марта 2025 г. Путин в Курской области заслушал доклад Герасимова о поражении ВСУ. Герасимов доложил:
* На долю курского плацдарма ВСУ приходится порядка 19% потерь личного состава и 40% потерь техники.
* В Курской области в плен взяты более 400 военных ВСУ.
* Киев хотел использовать Курскую область как разменную монету.
* Группировка «Север» за последние пять дней освободила 24 населенных пункта и 259 кв. км территории.
* Украинская группировка в Курской области изолирована, идет ее планомерное уничтожение.
Путин приказал Герасимову:
* Россия будет относиться к украинским военным, взятым в плен в Курской области, как к террористам.
* Иностранные наемники не подпадают под действие Женевской конвенции.<ref name= "Курск 11" />
Президент США Дональд Трамп попросил президента РФ Владимира Путина проявить гуманность и пощадить попавших в окружение украинских солдат. По оценкам экспертов, на 14 марта 2025 г. на территории Курской области в окружении оставалось еще до 5 тысяч военнослужащих ВСУ, около половины которых ранены, а примерно 15% ранены тяжело.<ref name= "Курск 12" /> Освобождение населенных пунктов Курской области позволяет выявить все новые факты военных преступлений, совершенных украинскими солдатами в отношении мирных жителей и российских военнопленных.<ref name= "Курск 13" /> Поэтому российские бойцы на Курском направлении почти перестали брать военнопленных – после бесчеловечных преступлений боевиков в Судже и Русском Поречном, якобы, поступил неофициальный приказ: "пленных не брать".<ref name= "Курск 14" /> Освобождение Суджанского района Курской области полностью завершилось 26 апреля 2025 г. С начала вторжения ВСУ погибло более 190 мирных жителей этого российского региона. ВСУ в ходе вторжения потеряли 76 тысяч военнослужащих. <ref name= "Курск 15" />
Войска Северной Кореи принимали участие в освобождении Курской области от боевиков киевского режима.<ref name= "Курск 16" /> 15 тысяч солдат Северной Кореи участвовали в освобождении Курской области и получили боевой опыт современной войны, из них 600 солдат КНДР погибли.<ref name= "Курск 17" />
Киев перебросил все резервы с Донбасса в Курскую область, где они уничтожались российской армией, а в это время российская армия ускорила наступление в Донбассе в 1,5 раза, что не так давно подтвердил президент России Владимир Путин. <ref name="Резервы 1" /> 18 августа 2024 г. российская армия освободила посёлок Нью-Йорк (Новгородское.<ref name= "Новгородское 1" /> Началось стремительное продвижение российской армии на Покровском (Красноармейском) направлении, российские войска почти без боя освободили Новогродовку, Карловку. Это похоже на обрушение украинского фронта на этом направлении.<ref name= "Покровск 1" />
В качестве мести за Курск ВС РФ нанесли удар по энергетике, газокомпрессорным станциям и аэродромам Украины 26 августа 2024 г. Машинный зал Киевской ГЭС был разрушен. <ref name= "Энерго 1" /> Первый из шести истребителей F-16, переданных Вашингтоном киевскому режиму, потерпел крушение на территории Украины, пилот погиб. Причиной крушения стала ошибка пилота, прошедшего ускоренный курс обучения или "дружественный огонь" с помощью зенитно-ракетного комплекса (ЗРК) Patriot, находящимся на вооружении ВСУ. Пилот поднимал самолёт в воздух, спасаясь от российского ракетного удара по аэродрому. <ref name= "Ф 16" />
3 сентября 2024 г. ВС РФ ударили двумя ракетами комплекса «Искандер» по территории учебно-тренировочного центра войск связи в Полтаве во время построения личного состава. По данным источников, в результате удара погибли и получили ранения порядка 500 украинских военных и иностранных наемников, ценных специалистов по связи, РЭБ и БПЛА. Этот удар стал одним из самых эффективных за всю историю СВО. В результате удара на плацу оказались разбросаны груды тел погибших и раненных.<ref name= "Полтава 1" /> Этот удар можно сравнить с "Атакой века" подлодки С-13 под командой Александра Маринеско в январе 1945 года, когда был потоплен лайнер «Вильгельм Густлофф» и более тысячи специалистов-подводников на его борту.<ref name= "Маринеско 1" />
Бои за Угледар длились около 2 лет. Город находится на возвышенности и состоит из многоэтажной застройки посреди голой степи, что помогает успешно обороняться. Российское командование поняло, что штурмовать этот город в лоб - это ошибка, поэтому в сентябре 2024 г. Угледар был взят в клещи (были захвачены посёлки западнее и восточнее города), затем город был почти окружён, была оставлена одна дорога из окружения, которая простреливалась с всех сторон. Половина украинцев, которые ночью пытались вырваться из окружения, погибали на этой дороге смерти. В городе оставалась 72 элитная мотивированная украинская бригада чёрных запорожцев (2 тысячи бойцов), которые остались без снабжения боеприпасами и без вывоза раненных. На их головы постоянно сыпались управляемые бомбы и снаряды. В плен сдалось около 1 тысячи человек, остальные погибли или чудом выбрались из окружения, морально сломленными. Угледар был освобождён в начале октября 2024 года. <ref name= "Угледар 2" /> Операцией командовал генерал Александр Семёнович Санчик.
===Российская тактика освобождения украинских городов===
Она состоит в следующем: Российская армия подходит к украинскому городу, окружает с трёх сторон, препятствует подвозу боеприпасов, личного состава, продовольствия и военной техники, мешает вывозу украинских раненных, украинские солдаты пытаются выйти из окружения по единственной "дороге смерти", которая обстреливается со всех сторон российскими солдатами, в результате украинские солдаты имеют огромные потери, как на "дороге смерти" Суджа-Коренево украинского плацдарма в Курской области. Особое значение имеют занятие господствующих высот и нанесение противнику огневого поражения. Если вы контролируете высоты, то вы контролируете весь населенный пункт. Если украинские солдаты пытаются организовать мощную оборону в высотной городской застройке, то эта застройка вместе с украинскими солдатами сносится до фундамента корректируемыми авиабомбами ФАБ и российской артиллерией. Чтобы этого избежать украинское командование пытается держать в городской застройке только корректировщиков артиллерийского огня и боевое охранение, но тогда российские штурмовики легко захватывают городскую застройку, где мало украинских солдат. Сегодня, в отличие от Второй мировой войны, штурмовые батальоны в прорывы никто не бросает. Сегодня действуют малыми группами до четырех человек, которые заходят в городскую застройку после артиллерийского удара, добивают противника, берут в плен деморализованных и оглушённых мощными взрывами украинских солдат. Вот в таком замкнутом круге сейчас оказывается украинская армия. С помощью такой тактики Россия освободила Артёмовск, Авдеевку, Новогродовку, Угледар, Селидово. Преимущество России в городских боях состоит в том, что у украинцев сейчас мало мотивированной пехоты. Российский мотивированный боец может бросить в окно или залезть на крышу многоэтажки и бросить в дырку на крыше противотанковую мину с 10 кг. тротила, а наш боец старается убежать на безопасное расстояние, при этом двухэтажный дом складывается вместе с украинскими солдатами, вооружённых пулемётом. В этом случае наш герой сам выживает, но, скорее всего, получает контузию.<ref name="Герой 1" /> По мнению Александра Полищука, Осенью 2022 года в России призвали по мобилизации 300 тысяч человек, а потом в России 600 тысяч человек убежало через Верхний Ларс. Тем самым российская экономика потеряла почти миллион рабочих рук. Потому в России и привлекают на СВО контрактников. Один боец в окопе, за спиной которого десять пушек, лучше, чем десять бойцов в окопе с одной пушкой. Военная экономика важнее героизма солдат. На надрыве выиграть нельзя. На стабильности – можно.<ref name="Штурм 1" />
В Донбассе оборона ВС Украины "посыпалась". В течение ноября 2024 года ВС России взяли в клещи и ворвались в г. Курахово Донецкой области в стремлении окружить этот город с трёх сторон.<ref name="Курахово 1" /> 31 декабря 2024 г. российская армия освободила город Курахово.<ref name="Курахово 2" /> «Основной смысл освобождения Курахова состоит в том, что это было последнее место, откуда украинская ствольная артиллерия дотягивалась до Донецка. Теперь обстрелять город можно только реактивными дальнобойными снарядами, но такое проводится крайне редко. Так что освобождение Курахова означает окончательное прекращение артиллерийского террора против Донецка.<ref name="Курахово 3" /> 13 ноября российские механизированные колонны с десантом на борту дерзко и стремительно ворвались в г. Купянск в Харьковской области по коридору, расчищенному ударами «Солнцепека».<ref name="Купянск 2" /> Российские войска сжали "клещи" вокруг посёлка Великая Новосёлка в Донецкой области в конце декабря 2024 г.<ref name="Новосёлка 1" /> 26 января 2025 г. посёлок Великая Новосёлка был освобождён.<ref name="Новосёлка 2" /> 7 февраля Российские войска освободили город Дзержинск (Торецк) в ДНР, из которого украинские войска обстреливали пригород Донецка Горловку. Упорные уличные бои за Дзержинск длились 6 месяцев.<ref name="Дзержинск 1" />
===Крепкий "Орешник". Предупредительный выстрел, после которого может начаться Третья мировая война и Апокалипсис===
Президент США Джо Байден дал разрешение ВС Украины наносить удары дальнобойными ракетами вглубь России.19 ноября 2024 года американскими ракетами ATACMS и 21 ноября британскими ракетами Storm Shadow были нанесены удары по объектам в Курской и Брянской областях. В ответ 21 ноября 2024 года ВС России нанесли демонстрационный удар по заводу Южмаш в Днепропетровске российской баллистической ракетой средней дальности "Орешник" в неядерном исполнении. В этот же день Президент РФ Владимир Путин выступил с телевизионным обращением, в котором заявил:
* США и их союзники по НАТО продолжили курс на эскалацию: "Экспертам хорошо известно, что использовать подобное оружие без прямого участия военных специалистов стран - производителей такого оружия невозможно".
* По украинскому "Южмашу" был нанесен удар новейшей баллистической ракетой средней дальности "Орешник" в безъядерном гиперзвуковом оснащении. Из этого растения в России раньше делали розги для наказания преступников.
* "Средств противодействия такому оружию не существует".
* При использовании системы "Орешник" заранее будут распространяться оповещения для мирного населения по гуманитарным соображениям.
* "Мы готовы к любому развитию событий. Если в этом кто-то еще сомневается, то напрасно. Зеркальный ответ всегда будет". У нас длинные руки.
* "Мы считаем себя вправе применять наше оружие против военных объектов тех стран, которые позволяют применять свое оружие против наших объектов".
* Российские войска успешно продвигаются в зоне проведения СВО по всем направлениям. Использование противником дальнобойных западных ракет не в состоянии помешать этому наступлению.<ref name="Орешник 1" />
Удар ракетой "Орешник" и предупреждение Владимира Путина вызвало панику в странах Запада, где считали, что Путин не решится на ответный удар и что Путин способен только "красные линии" на карте рисовать, а не ударить кулаком по столу.
===Летнее наступление российской армии в 2025 г.===
31 июля 2025 Минобороны России сообщило, что в результате наступательных действий «Южной» группировки войск город Часов Яр полностью освобождён. Упорные бои за этот город длились 15 месяцев. Российские войска были вынуждены освободить этот город методом лобового штурма, а не окружения. Противник на данном участке фронта потерял около 7,5 тысяч военнослужащих. Сложность состояла в том, что этот город находится на самой высокой точке в радиусе сотен километров: высота местности достигает 247 метров. Эта возвышенность является отличной позицией для дальнобойной артиллерии. Противник превратил это город в неприступную крепость. Этот город является воротами в западный Донбасс.<ref name="Часов Яр 2" />
Андрей Клинцевич заявил, что российские войска продолжают наступление, выстраивая тактику окружения через малые котлы — Покровск, Константиновка, Северск и Купянск. Эти города прикрывают Славянск, Краматорск и важные логистические узлы.<ref name="Котлы 1" /> Окружение Покровска и Константиновки было достигнуто с помощью прорыва в г. Доброполье, который находится между ними. прорыв был достигнут методом просачивания российских диверсионно-разведывательных групп, а не штурма. После этого украинские войска пытались срезать этот выступ на Доброполье, но украинская контратака была отбита. <ref name="Доброполье 1" /> 26 октября 2025 года Начальник Генерального Штаба Валерий Герасимов доложил Верховному главнокомандующему Владимиру Путину о том, что российские войска взяли в окружение украинские гарнизоны городов Красноармейск (Покровск) и Купянск. В окружение взято около 5 тысяч бойцов ВСУ в Купянске и больше 5 с половиной тысяч в Красноармейске. Есть высокая вероятность их массового взятия в плен.<ref name="Купянск 10" /> Украинский генерал Сырский организовал контрудар из Доброполья на прорыв к окружённым украинским солдатам в Димитрове (Мирноград, город, расположенный рядом с Красноармейском). для этого Сырский собрал все резервы с других фронтов и тем самым ослабил эти фронты. Сырский отвлёкся на Красноармейск, этим воспользовалась российская армия и нанесла рассекающий удар с правого фланга в обход Гуляйполя и Орехова в направлении на Запорожье и Днепропетровск, обходя всю линию украинской обороны на Юге. Таких рассекающих ударов не было с начала СВО. Этот прорыв произошёл на глубину 10 километров и ширину больше 20 километров за 12 дней. Военный обозреватель немецкой газеты Bild Юлиан Репке тем временем заявил, что линия обороны ВСУ на востоке Запорожской области уже рухнула.<ref name="Гуляйполе 10" /> 20 ноября 2025 г. Валерий Герасимов доложил Владимиру Путину, что российская армия освободила г. Купянск. Бои за 25-тысячный Купянск шли много месяцев. В ходе упорных боев российские войска зашли в Купянск с востока, форсировали реку Оскол севернее Купянска и создали плацдарм в районе Двуречной. Закрепившись и подтянув силы, двинулись дальше. В июне 2025 г. взяли Московку — северо-западный пригород Купянска. А в сентябре уже в третий раз за эту войну российская армия провернула операцию „Труба“. Подразделения группировки „Запад“ проникли в город по трубе магистрального газопровода. Очевидно, эта тактика опять себя оправдала. Противника застигли врасплох, зашли ему в тыл в обход основных узлов обороны. <ref name="Купянск 11" /> 30 ноября 2025 г. начальник Генерального штаба Валерий Герасимов доложил Верховному главнокомандующему Владимиру Путину об освобождении городов Волчанск и Красноармейск (Покровск). <ref name="Волчанск 10" /> 11 декабря 2025 г. начальник Южной группировки войск Сергей Медведев доложил Владимиру Путину об освобождении города Северск.<ref name="Северск 1" /> 27 декабря 2025 г. начальник Генерального штаба Валерий Герасимов доложил Владимиру Путину о том, что российские войска освободили города Димитров (Мирноград) Донецкой Народной Республики, Гуляйполе и Степногорск Запорожской области. <ref name="Гуляйполе 11" />
===В российском генштабе развернулась борьба кланов? Паркетные генералы против боевых генералов. Генерал-катастрофа против мастера штурмов.===
Паркетные генералы в мирное время хорошо умели организовывать парады и танковые биатлоны, словом, пускать пыль в глаза властям. Коррупционеры в мундире в мирное время организовали преступные схемы по разворовыванию государственных денег из военного бюджета. С началом СВО эти паркетные генералы оказались полностью непригодными для того, чтобы одержать победу, они терпели поражения, что привело к отступлению российских войск в Херсонской, Харьковской и Курской областях. Им на смену неизбежно должны прийти маршалы победы, подобные Жукову и Рокосовскому, как это было в Великую отечественную войну при Сталине. Но эта борьба кланов между паркетными генералами и боевыми генералами идёт трудно и с переменным успехом. Такая борьба кланов между паркетными генералами шла во все времена в начале большой и длинной воны. Неудачные действия паркетных генералов стали одной из причин того, что СВО стало трудной и долгой войной на истощение, а не блицкригом. Оказалось, что российская армия к началу СВО во многом отстала в развитии от западных армий, особенно в сфере беспилотников, связи, космической разведки и дальнобойной артиллерии. В ходе войны пришлось навёрстывать это отставание.
По мнению Ивана Прохорова, командующий группировкой "Север" генерал Александр Лапин был, наконец, отправлен в отставку за отступление из Красного Лимана, неудачи у Чернигова и при переправе через Северский Донец, везде сопровождавшиеся серьезными потерями. Военные эксперты обвиняли его и в неэффективном создании буферных зон на севере Харьковской области в 2024 году и на Сумщине в 2025 году. Именно Лапин не смог организовать оборону при прорыве врага, что привело к оккупации Курской области в августе 2024 года. генералы Александр Журавлев, Александр Чайко, Александр Дворников тоже были отправлены в отставку. Это было сделано без лишнего шума, так как признать провал такого командира – это значит признать ошибку тех, кто его назначал и покрывал. Отправлен в отставку Рустам Мурадов, под чьим командованием под Угледаром развернулась настоящая катастрофа, этот генерал предпочитал бросать бойцов в лобовые штурмы, что приводило к огромным потерям. Бывший замминистра обороны Тимур Иванов получал взятки на миллиарды рублей был отправлен в отставку был приговорён к 13 годам колонии за растрату.Президент Владимир Путин назначил министром обороны экономиста Андрея Белоусова министром обороны вместо Сергея Шойгу, чтобы этот ревизор (Анрей Белоусов) вычистил министерство обороны от взяточников и коррупционеров.
Но не всё так гладко. Борьба кланов в генеральном штабе идёт с переменным успехом. Есть потери и в клане боевых генералов. Все еще служит в Алжире прославленный "генерал Армагеддон" – Сергей Суровикин. После мятежа ЧВК "Вагнер" бывший командующий Объединенной группировкой войск в зоне СВО, чей талант военачальника позволил спасти тысячи жизней наших бойцов под Херсоном, фактически оказался в опале. Хотя он очень нужен на СВО. В тюрьме по странному обвинению отбывает срок экс-командующий 58-й армией Иван Попов, открыто говоривший о проблемах армии. Герои гибнут, как замкомандующего 41-й армией Андрей Суховецкий, как заместитель главнокомандующего ВМФ России Михаил Гудков. Либо… сталкиваются с аппаратным сопротивлением. Боевой генерал Андрей Мордвичёв назначен командующим Сухопутными войсками ВС РФ за безусловную эффективность своей боевой работы и великолепное стратегическое мышление. Еще один пример – командующий ВДВ и группировкой "Днепр" генерал-полковник Михаил Теплинский, крайне талантливый и непредсказуемый для врагов, очень любимый бойцами военачальник. Но такие случаи все еще слишком редки. Пока аппаратные игры преобладают над здравым смыслом, мы будем сталкиваться с парадоксом: те, кто виновен в провалах, получают мягкое "спасибо за работу", а боевые генералы под различными предлогами отстраняются от дел. Война требует ясной кадровой политики, где решения основаны на заслугах, а не на связях. <ref name="Кланы 1" /> Ещё один боевой генерал Александр Санчик был назначен заместителем начальника Генерального штаба, отвечающего за тыловое обеспечение войск, состоялось 7 ноября 2025 г. Это назначение должно улучшить снабжение войск современным оружием и искоренить коррупцию.В первые дни спецоперации его войска охватили Киев в клещи с Запада. <ref name="Санчик 2" />
===Коррупционный скандал в Киеве, операция "Мидас"===
Мидас - это царь в Древности, имевший способность превращать в золото любые вещи, к которым он прикасался. 10 ноября 2025 г. НАБУ (Национальное Антикоррупционное Бюро Украины) опубликовало плёнки с прослушивающих устройств в квартире Тимура Миндича и провело обыски. Сам Миндич сумел заблаговременно сбежать в Израиль. Сам Миндич- это "кошелёк" Зеленского. Миндич имел прозвище Карлсон. В туалете Миндича обнаружили золотой унитаз. Миндич организовал коррупционную схему откатов в министерстве энергетики в 10-15 процентов от суммы сделки на строительство защитных сооружений для электростанций на фоне российских ракетных ударов. Украинцы сидят без света, а друзья Зеленского на этом наживаются. Миндич украл на этом минимум 100 миллионов долларов. НАБУ опубликовал фото спортивных сумок, набитых пачками долларов, из квартиры Миндича. Второе коррупционное дело состоит в том, что Миндич уговорил министра обороны Украины Рустема Умерова купить за взятку бракованные "картонные" бронежилеты для министерства обороны по завышенной цене. Украинские солдаты идут в бой в "картонных" бронежилетах, а Миндич делает деньги на крови. В результате Умеров сбежал в Турцию, спасая свою шкуру. Под угрозой оказались президент Украины Владимир Зеленский и руководитель офиса президента Андрей Ермак, по прозвищу Али-Баба. <ref name="Карлсон 1" /> 28 ноября утром в квартире Анрея Ермака прошли обыски по инициативе НАБУ, вечером Ермак подал в отставку с поста руководителя офиса президента, Ермак был "правой рукой" Зеленского<ref name="Ермак 1" />. Это означает, что американцы давят на Зеленского с целью принудить к небольшим территориальным уступкам в пользу России, чтобы избежать безоговорочной капитуляции и потери всей Украины. Украинские коррупционеры воруют американские деньги, теряют авторитет внутри Украины и на международной арене, всё это выгодно для России.
===Насильственная мобилизация и дезертирство в украинской армии===
Насильственная мобилизация и дезертирство стали следствием больших потерь украинской армии на фронте. ТЦК (Территориальные центры комплектования, украинские военкоматы) хватают всех мужчин призывного возраста без разбора на улицах украинских городов, "пакуют" и заталкивают их в микроавтобусы на улицах с применением насилия и наручников, отвозят их в военкоматы, а после медкомиссии и краткосрочной военной подготовки отправляют на фронт как "мясо".Это вызывает протесты и сопротивление окружающих людей, особенно матерей и родственников призывников вплоть до попыток освободить призывников из военкоматов. Эти родственники сотрудничают с Россией и присылают координаты ТЦК, для их последующего уничтожения с помощью российских дронов.<ref name="Дезертиры 1" /> Злоупотребления ТЦК вызывает массовые попытки мужчин призывного возраста сбежать из Украины через границу. В июне 2025 г. 45-летний украинец венгерского происхождения Йожеф Себестьен умер после того, как ТЦК-шники избили его железными прутьями. В июне 2024 года дезертир был застрелен пограничником при попытке пересечь границу Украины с Молдавией.30 октября 2025 г. в Одессе группа протестующих против принудительной мобилизации мужчины перевернула патрульный микроавтобус.
Большие потери украинской армии на фронте вызывают массовое дезертирство солдат, СОЧ (Самовольное оставление части), массовую сдачу в плен. Чтобы справится с этой проблемой на фронте в украинской армии применяются заградотряды из числа идейно мотивированных националистов, которые имеют право уничтожать дезертиров. В январе 2025 года сообщалось, что около 1 700 военнослужащих 155-й механизированной бригады имени Анны Киевской, прошедших подготовку во Франции и оснащенных французскими самоходными гаубицами, ушли в самоволку.За последние четыре года более 20% миллионной армии Украины подались в бега, и ряды дезертиров постоянно пополняются. <ref name="Дезертиры 2" />
===Боевые действия в 2026 г. - самый жёсткий этап СВО===
29 декабря 2025 г. 91 ударный украинский дрон атаковал резиденцию президента России Владимира Путина в Новгородской области.Все беспилотники были уничтожены. В ответ на этот акт государственного терроризма 9 января 2026 г. ВС РФ нанесли удар гиперзвуковой ракетой Орешник по объекту производства БПЛА — Львовскому авиаремонтному заводу. Западные системы ПВО оказались бессильны перед российским оружием, эти системы ПВО просто не видели удар гиперзвуковой ракеты.Это был демонстративный удар в 80 километрах от границ НАТО, чтобы поляки хорошо видели эти "божьи стрелы".<ref name="Орешник 2" />
Самое страшное для любой армии — оказаться в полном окружении без подвоза боеприпасов, еды и воды. Именно это произошло в середине июня 2026 г. с группировкой ВСУ в г. Константиновка. Российские войска охватили город с трех сторон. Четвертая сторона, "бутылочное горлышко" около 2 километров, которая ведет в сторону потенциального отступления, полностью простреливается. Украинское командование запретило своим войскам отступать, поэтому эти войска обречены погибнуть или сдаться в плен. Российские войска используют корректируемые бомбы, артиллерию, и дроны против украинских солдат, окружённых в цехах и подвалах металлургического завода. Этот завод превратился в мышеловку.<ref name="Константиновка 1" /> Освобождение Константиновки откроет дорогу с южного фланга на дугу украинских крепостей в Донбассе - на Дружковку, Краматорск, Славянск. 3 июля 2026 г. Константиновка была освобождена. .<ref name="Константиновка 2" />
В середине июня 2026 г. украинские войска были окружены в г. Красный Лиман. Мост через р. Северный Донец был взорван, дорога через этот мост вела в Красный Лиман, по ней шло снабжение окружённых украинских войск. Освобождение Красного Лимана должно открыть дорогу российской армии на Славянск с северо-востока.<ref name="Лиман 1" />
Украинская армия превратила город Орехов в крепость, которая защищала дорогу на областной центр Запорожье с юга. Казалось, что единственный реалистичный сценарий — обойти город с флангов, отрезать снабжение, задушить гарнизон в кольце. Логично, но предсказуемо. И тогда случилось то, чего никто не ожидал: российские штурмовики пробили оборонительную линию и вышли на южные окраины Орехова. Растерянные подразделения ВСУ начали откатываться вглубь городской застройки. В результате город Орехов был освобождён в сентябре 2026 года. Дорога для наступления российской армии на Запорожье была открыта. <ref name="Орехов 2" />
В сентябре 2026 г. на севере Харьковской области украинские войска попали в окружение - в Волчанский котёл. Площадь котла - 460 квадратных километров.<ref name="Волчанский котёл 1" /> Количество окружённых украинских солдат - около 1700. Эти украинские солдаты стали предпринимать безуспешные попытки вырваться из окружения. Российские войска стали разрезать котёл на части как в Сталинграде. В результате этой операции буферная зона в Харьковской области на границе с Россией была значительно расширена.<ref name="Волчанский котёл 2" />
В сентябре 2026 г. украинские войска были окружены в г. Доброполье Донецкой области. В результате элита ВСУ - 2 бригады национальной гвардии и 425-й штурмовой полк «Скала» (всего около 1 тыс. солдат) оказались в окружении. Эти украинские солдаты совершили несколько неудачных попыток вырваться из окружения. Для уничтожения окружённых украинских солдат используются беспилотники, артиллерия и авиация. Почему ВСУ раз за разом оказываются в окружении? Президент Украины Владимир Зеленский пошёл по пути Гитлера и стал создавать города-фестунки, фортеции (крепости). Смысл понятен, в застройке войскам легче удержаться, но такие крепости неизбежно оказываются в окружении, а окружённые солдаты испытывают голод и нехватку боеприпасов, медикаментов, невозможно вывезти раненных. Окружённые солдаты вынуждены предпринимать безуспешные попытки вырваться из окружения, сдаваться в плен или погибнуть. Значение освобождения Доброполья состоит в том, что это создаёт угрозу окружения таких донецких городов, как Славянск и Краматорск с юго-запада. <ref name="Доброполье 3" />
Украинский локальный контрудар севернее г. Красный Лиман под названием «Вивальди»- это удар по северной клешне российских войск, пытающихся окружить Славянск и Краматорск на Донбассе. Контрудар наносился как по нотам силами 3-го армейского корпуса ВСУ ("Азов"). Украинцам удалось обмануть Генштаб РФ. Украинцы сумели скрытно сосредоточить свой 12-тысячную ударную группировку. Бригады ВСУ были рассредоточены мелкими ротными группами в глубоком тылу на расстоянии 40-60 км. от линии фронта и в назначенный час выдвинулись к линии фронта. Российские войска не успели уничтожить силы противника на подходе. Украинские комплексы РЭБ "ослепили" российские окопные квадрокоптеры на данном участке. Украинцы применили войну роботов:
* воздушные БПЛА-камикадзе типа Hornet с искусственным интеллектом, которые уничтожали российские транспортные средства со снарядами,
* гусеничные роботы-саперы для прорыва безопасных "троп" в российских минных полях,
* штурмовые роботы-камикадзе,которые стреляли из гранатомётов по амбразурам российских ДОТов, заезжал в проёмы и взрывался внутри узла сопротивления.
Таким образом, к концу 2026 года на фронтах СВО окончательно оформились две принципиально разные концепции преодоления позиционного тупика - «Концентрированный кулак» ВСУ против «просачивания» ВС РФ. Украинцы нанесли быстрый, шоковый удар механизированными подразделениями на глубину до 15 километров под прикрытием тотального РЭБ-ослепления, пытаясь вернуть маневренный характер войны. Русским следует учиться этому приёму у противника. Новая техника рано или поздно всё равно позволит преодолеть позиционный тупик на фронте, маневренная война сумеет преодолеть пассивную оборону. <ref name="Вивальди 1" />
===Инфраструктурная война между Россией и Украиной===
В сентябре 2025 г. Президент Украины Владимир Зеленский прямо заявил о том, что ведет инфраструктурную войну с Россией Инфраструктурная война означает удары по электростанциям, газопроводам, железнодорожным узлам, военным заводам, трансформаторным подстанциям, мостам, тоннелям, портам, танкерам с помощью террористов, ракет и беспилотников. Проблема для Украины состоит в том, что силы (запас ракет и беспилотников) не равны между Россией и Украиной. ВС Украины не гнушались наносить удары и по гражданским объектам, тогда как ВС России наносят удары только по военным объектам и по тем электростанциям и железнодорожным узлам, которые используются для снабжения ВС Украины и военных заводов. Побочным эффектом российских ударов по украинской инфраструктуре стало уничтожение снабжения украинских городов электроэнергией, газом, теплом, водой, уничтожение канализации. Такие крупные украинские города, как Киев зимой 2025 г. во время январских морозов стали замерзать и постепенно превращаться в ледяные дворцы, в непригодные для жизни города, когда лопаются батареи, трубы и система канализации, когда фекалии льются с верхних этажей. Чтобы это предотвратить, украинские коммунальщики пытались сливать воду из системы. Жители Киева были вынуждены или уехать из города на дачи или к родственникам в дома с печным отоплением, или пытаться выжить, поселившись в маленьком помещении типа кухни или ванной комнаты, пытаться согреть её с помощью туристической газовой горелки, устроить освещение с помощью свечей, электрических фонариков, бензиновых генераторов и устанавливать уличные биотуалеты в каждом дворе. Мэр Киева Виталий Кличко призвал население по мере возможности эвакуироваться в сельскую местность, повинуясь этому призыву только за январь 2026 г. столицу Украины покинули около 600 тысяч человек. Эта коммунальная катастрофа ударила по моральному духу украинцев. Начались стихийные протесты с требованием к Зеленскому отдать России остатки Донбасса. <ref name="Киев 1" /> Это и есть "Холодная война", "будем бить аккуратно, но сильно".С декабря 2025 года «фокус» ударов по инфраструктуре Украины был сужен – атаки поочередно пошли в основном на Одессу, Днепропетровск и Киев во время аномальных холодов. Цель этих атак – изолировать эти города от национальной электрической сети, а затем уничтожить электростанции вокруг этих городов. <ref name="Киев 2" /> Зеленский обещал устроить блэкаут в Москве, а вместо этого получил его в Киеве.
В начале февраля 2026 г. в результате ударов российских ракет и дронов были уничтожены подстанции 750 кВ, которые соединяют 3 атомных станции Украины с электросетью на Западной Украине. Украинцы были вынуждены остановить работу всех своих трёх АЭС - Ровенской, Хмельницкой и Южно-украинской. Из-за этого в стране наблюдается катастрофическая нехватка электроэнергии, и даже перетоки электроэнергии из Европы не способны особо помочь. Отсюда большая часть страны сидит фактически без электричества. <ref name="Электро 10" />
Весной 2026 г. Украина начала наносить чувствительные удары по инфраструктуре России. В ночь на 3 мая 2026 года само определение "тылового района" было официально выброшено на помойку истории. Той ночью Министерство обороны РФ зафиксировало 740 украинских беспилотников над регионами России — это абсолютный рекорд. За апрель 2026 г. таких волн было много: по данным МО РФ, за месяц было перехвачено не менее 9 372 украинских БПЛА. Так выглядит война против российской промышленности. Например, в апреле Украина нанесла удары барражирующими беспилотниками по нефтеперерабатывающему заводу "Роснефти" в Туапсе, по одному из главных балтийских нефтеналивных терминалов "Усть-Луга Ойл", в 120 километрах от Петербурга. Эти украинские беспилотники летели на Ленинградскую область над странами НАТО - над Польшей, Литвой, Латвией, Эстонией и Финляндией. 7 мая 2 украинских беспилотника АН-196 "Лютый" упали на юго-востоке Латвии, в 40 километрах от российской границы. Один из них поразил резервуарный парк в Резекне. Сгорели четыре пустых нефтяных резервуара. Перехватить украинские дроны пытались истребители Rafale — безуспешно.Украина наладила поточное производство дронов и получила возможность выпускать по несколько сотен дронов ежедневно. Украинская дроностроительная индустрия — это не одна большая государственная фабрика, а децентрализованная экосистема из 150 с лишним производителей. Одни собирают FPV-камикадзе в подвалах, другие — дальнобойные аппараты на полузакрытых заводских мощностях, до 10 миллионов единиц в год. Эту инфраструктуру почти невозможно накрыть одним точным ударом: нет "центрального завода", выведение которого из строя остановит поток. "Лютый" — флагманский инструмент тыловых ударов ВСУ. Это аппарат самолётного типа с толкающим винтом, двигателем в 50 лошадиных сил и дальностью от тысячи до двух тысяч километров в зависимости от модификации. Стоимость одного аппарата — около 200 тысяч долларов. Там, где натовцы представят 10, 15 или 20 разных моделей — "зоопарк" техники — Россия выставит одно решение среднего качества, но в колоссальных объёмах. На войне это — самое главное преимущество". Иллюстрация такого подхода — завод "Алабуга" в Татарстане. Здесь выпускаются сотни ударных дронов Герань в день, налажен конвейер в самом прямом смысле слова. Для борьбы с беспилотниками применяются мобильные огневые группы - расчёты на пикапах, вооружённые, например, советскими зенитными установками ЗУ-23-2. Задача уничтожения дрона упрощается тем, что дрон — цель крупная и тихоходная. <ref name="Дроны 3" />
Удары украинских беспилотников по 24 российским нефтеперерабатывающим заводам вызвали дефицит топлива на автозаправках по всей России летом 2026 г., в результате производство топлива в России снизилась примерно на треть. Россия превратилась из экспортёра в импортёра
топлива из Белоруссии, Индии, Казахстана, Марокко. <ref name="НПЗ 1" />
22 мая 2026 г. украинская армия совершила террористический акт против граждан России - удар беспилотниками самолётного типа по общежитию педагогического колледжа в г. Старобельск Луганской области, в результате здание общежития было разрушено, 21 человек погиб. В ответ 24 мая 2026 г. российская армия нанесла удар возмездия ракетами Орешник и Кинжал, беспилотниками Герань по Киеву. Третий за всю историю операции на Украине удар ракеты Орешник был нанесён по аэродрому в г. Белая Церковь около Киева. <ref name="Старобельск 1" />
12 июля 2026 года Вооружённые силы России начали кампанию по блокаде портов в Одессе. Основное внимание было уделено ударам по судам, следующим в Одесскую область. В Одессу эти суда НАТО везут оружие для украинской армии, обратно - украинское зерно на экспорт. также эти суда используются Украиной в качестве носителей морских дронов для атак на российские суда и российское побережье. Главным инструментом для уничтожения судов НАТО стали российские реактивные беспилотники Герань 4 Сикер. За 3 недели этой операции было повреждено 120 судов НАТО. В результате этой самой успешной российской операции была установлена морская блокада Украины, движение судов в порты Одессы прекратилось полностью. Экспорт зерна и металлов с Украины значительно сократился, импорт орудия на Украину тоже сократился. Украинское правительство пыталось компенсировать потерю экспорта через черноморские порты с помощью вывоза по железной дороге и автомобильных дорог в Румынию и Польшу, но тогда российская армия начала наносить удары по мосту в Затоке, который соединяет Украину с Румынией. <ref name="Блокада 1" />
Военный эксперт Василий Дандыкин заявил, что ВС РФ последовательно уничтожают черноморские порты, металлургические заводы, мосты через Днепр в Киеве, железнодорожные локомотивы, АЗС, склады с ракетами и беспилотниками, теплоэлектростанции, ДАТА-центры (украинский интернет). В Киеве российские беспилотники повредили Северный и Южный мост (2 из имеющихся 9 мостов), что вызвало транспортный коллапс. По этим мостам осуществляется снабжение оружием украинских войск в Донбассе из стран НАТО через сухопутную границу Украины. Киев стал прифронтовым городом, что вызвало бегство из Киева мирных жителей и иностранных дипломатов.Украинская промышленность остановила выпуск стали. <ref name="Блокада 2" />
===Международная обстановка и экономика во время российской спецоперации на Украине===
Перед началом военной спецоперации на Украине президент Владимир Путин предупредил страны НАТО и США о тяжёлых последствиях в случае прямого военного столкновения из-за Украины.<ref name="Путин 2" />Только Россия на сегодняшний день имеет гиперзвуковое оружие. США вынуждены считаться со своим отставанием в этом виде оружия. Гиперзвуковые ракеты нельзя сбить никакими средствами ПВО на сегодняшний день. Американские авианосцы превратились в лёгкую мишень для российских гиперзвуковых ракет. 4 января 2023 года в поход отправился "убийца авианосцев" российский фрегат «Адмирал Горшков», вооружённый гиперзвуковыми ракетами "Циркон" (16 штук на борту). Это событие превратило американские авианосцы в устаревший вид кораблей, как когда-то появление авианосцев после первой мировой войны превратило линкоры и дредноуты в устаревшие виды кораблей. <ref name="Циркон 1" /> Судьба авианосцев напоминает судьбу гигантских вымерших динозавров. Хотя ещё недавно в США говорили, что Владимир Путин пугает страны Запада "мультиками" об этом оружии. Санкции, главным образом, означали запрет на торговлю с Россией. Россия заранее подготовилась к экономическим санкциям Запада, поэтому эффект от них оказался незначительным. Курс доллара и уровень инфляции в России сначала подскочили с началом военной спецоперации, а затем снизились до довоенного уровня. На Западе была "заморожена", то есть, фактически, украдена половина российских золото-валютных резервов, вырученных от продажи российской нефти и газа. В ответ президент Владимир Путин предложил недружественным странам Запада в дальнейшем платить за российский газ в рублях через российские банки, иначе Россия угрожает отключить газ в эти страны. Россия уже отключила природный газ в такие европейские страны, как Литва, Латвия, Эстония, Нидерланды, Болгария, Польша, Финляндия, которые отказались платить за газ в рублях. В другие европейские страны, прежде всего в Германию, поставки российского газа были сокращены, что вызвало рост цен на газ в этих странах. Это показывает, что Россия держала эти европейские страны за горло. Европейцы пытаются избавиться от российского влияния. Поставки российского газа через территорию Украины по газопроводу продолжаются даже в условиях войны. Плата за газ в рублях в будущем исключит возможность замораживать российские вклады в банках в принципе и повысит курс российского рубля. Это должно понизить курс доллара как общемировой валюты и поднять курс рубля и китайского юаня как мировых валют. США сегодня вовсю используют свой печатный станок для печатания долларов и не боятся увеличивать свой государственный долг до гигантских размеров, хотя курс этого доллара ничем не обеспечен. Просто в мире не существует другой более авторитетной общемировой валюты, США пользуются своим монопольным положением на мировом рынке, а другие страны вынуждены с этим мириться. Когда-то должен наступить конец этому мыльному пузырю, который должен лопнуть. Китай не поддержал американские санкции против России.<ref name="Китай 1" /> США мешают Китаю присоединить Тайвань. Поэтому у США не получилось построить полную блокаду против России. К тому же санкции против России вызвали рост цен на Западе на российские и украинские товары - газ, нефть, бензин, цветные металлы, ракетные двигатели, химические удобрения, зерно и продовольственные товары. Некоторым развивающимся странам угрожает голод из-за роста цен на продовольствие и химические удобрения на мировом рынке. 3 декабря 2022 г. страны Запада договорились о потолке цен на нефть из России - $60 за баррель, чтобы снизить возможности России по финансированию военных действий на Украине <ref name="Нефть 1" />. В ответ 27 декабря 2022 г. президент РФ Владимир Путин издал указ о запрете поставок российской нефти по контрактам, где указана предельная цена на поставляемую нефть. <ref name="Нефть 2" /> Нападение палестинского движения "Хамас" на Израиль 7 октября 2023 года вызвало войну, которая должна заставить перенаправить часть военной помощи Запада с Украины в Израиль, это выгодно для России.<ref name="Хамас 1" /> 1 января 2025 года по инициативе украинских властей прекратился транзит российского газа по территории Украины в такие страны, как Австрия, Венгрия, Словакия, Молдавия, Украина. Венгрия договорилась с Россией о продолжении поставок российского газа, только через "Турецкий поток" и "Балканский поток".Газопровод "Сила Сибири" из России в Китай вышел на предельную мощность в 2024 году. Другой газопровод в Китай "Дальневосточный маршрут" заработает в 2027 году.Европа же будет вынуждена платить за газ из других стран, в том числе за американский сжиженный газ, значительно больше, чем за российский трубопроводный газ.Жители Украины и Молдавии после этого не могут воровать в принципе дешёвый трубопроводный российский газ и будут вынуждены покупать дорогой американский сжиженный газ или топить печку дровами. <ref name="Газ 1" />Молдавия и Австрия отказались платить долги Газпрому за ранее поставленный газ. Поэтому прекращение поставок газа этим должникам было справедливым шагом.<ref name="Газ 2" /> <ref name="Газ 3" />
5 ноября 2024 г. состоялись выборы президента США. На этих выборах победил Дональд Трамп из Республиканской партии и он станет 47-м президентом США. В процессе выборов кандидат от Демократической партии 46-й президент США Джозеф Байден сошёл с дистанции и его место место на выборах заняла вице-президент Камала Харрис, которая безнадёжно проиграла по результатам этих выборов. Дональд Трамп много раз заявлял, что в случае победы он готов завершить украинский конфликт всего за сутки. Посмотрим, что из этого получится.<ref name="Трамп 1" /> 12 февраля 2025 г. состоялся телефонный разговор между Дональдом Трампом и Владимиром Путиным. 18 февраля 2025 года в Саудовской Аравии начался первый раунд российско-американских переговоров о мире на Украине, украинцев и европейцев на эти переговоры не пригласили. <ref name="Трамп 2" /> 28 февраля 2025 года состоялись переговоры между Дональдом Трампом и Владимиром Зеленским, которые закончились провалом и грандиозным скандалом на пресс-конференции. Суть разногласий между этими президентами состояла в том, что Трамп хотел заключить мир ("сделку") между Украиной и Россией, а Зеленский хотел продолжать войну и дальше получать оружие и деньги от США. Трамп поставил своей целью сократить расходы США на внешнюю политику, сократить внешний долг и предотвратить Третью мировую войну между США и Россией. Трамп пытался убедить Зеленского, что у Зеленского нет козырей на руках и война проиграна, что проблемы у Зеленского начинаются прямо сейчас. Не смотря на это Зеленский продолжал спорить, ругаться матом, проявил неуважение к хозяевам, вопреки дипломатическому протоколу, явился на переговоры в кофте с трезубцем, поэтому Трамп саркастически заметил, что Зеленский приоделся сегодня. В конце встречи Трамп решил, что Зеленский ещё не готов к мирным переговорам с Россией и Трамп приказал своим помощникам вышвырнуть Зеленского из священного Овального кабинета Белого дома. <ref name="Трамп 3" /> Бывший советник президента США по нацбезопасности Джон Болтон заявил после телефонных переговоров между Трампом и Путиным: «Трамп сдался Путину еще до начала переговоров. Они в Кремле сейчас пьют водку прямо из горла по случаю такой победы».<ref name="Трамп 4" /> Администрация Трампа в качестве посредника пыталась вести переговоры с правительствами России и Украины о заключении мира. Эти переговоры зашли в тупик, поэтому США официально вышли из переговорного процесса по Украине 1 мая 2025 г.<ref name="Трамп 5" /> 15 августа 2025 г. состоялась встреча между президентом США Дональдом Трампом и президентом России Владимиром Путиным.<ref name="Аляска 1" /> Встреча закончилась обменом мнениями между ними на украинский конфликт, компромиссного решения добиться не удалось. Трамп предлагал заключить мир на Украине по линии разграничения украинских и российских войск, тогда 20% украинской территории отошло бы к России, но эти условия не устроили Путина, потому что это бы не привело к достижению целей спецоперации. По-видимому, всё должно решиться на поле боя. Трамп - это торговец по своей основной профессии и пытается вести торг с Путиным, Трамп пытается поиграть в доброго и злого полицейского, но такой подход Россию не устраивает. Путин понимает, что его снова могут обмануть так, как было во время минских переговоров, когда Запад вёл переговоры о мире на Украине, а на самом деле выигрывал время для вооружения Украины. Путин понимал, что после заключения мира на условиях Трампа страны НАТО смогут ввести оккупационные войска на Украину, российское руководство предупредило, что во время войны эти войска станут законной целью для военно-космических сил России. Путин понимал, что оставшаяся часть Украины снова станет источником агрессии против России в будущем. Цель Путина на переговорах с Трампом - попытаться расколоть единый фронт Запада против России. Таким образом, переговоры между Путиным и Трампом пока зашли в тупик, поэтому следующим ходом Путин зашёл с козырей - Путин сообщил об успешных испытаниях принципиально нового оружия, которое может обойти любую противоракетную оборону и уничтожить США - крылатой ракеты Буревестник и сверхмощной торпеды Посейдон с ядерными двигателями.«Буревестник» и «Посейдон» – это не просто новое оружие, это настоящая революция в военном деле.Главное достоинство ракеты Буревестник состоит не в скорости, а в неограниченной дальности полёта, в способности маневрировать, менять маршрут, обходить зоны контроля вражеского ПРО и ПВО, в способности проходить маршрут на сверхмалых высотах до 5 метров над уровнем моря, скрываясь в складках местности на суше. Супермощная торпеда Посейдон запускается с подводной лодки, эта торпеда движется на глубине до 1 км со скоростью 200 км. в час, поэтому её невозможно перехватить с помощью противолодочной обороны противника, взрыв торпеды должен вызвать радиоактивное цунами, которое должно уничтожить военные базы и города на побережье противника. <ref name=" Буревестник 1" /> <ref name=" Посейдон 1" />Если не удалось договориться по хорошему, то значит нужно договариваться с позиции силы, а судьба Украины решится на поле боя. В результате Трамп был вынужден пока отказать Украине в поставках ракет Tomahawk, которыми можно бить по городу Москва.<ref name="Томагавк 1" />
28 февраля 2026 года США и Израиль нанесли неожиданный авиационный и ракетный удар по Ирану. Цель - обезглавить иранский режим, уничтожить его лидеров одним ударом, чтобы вызвать хаос в Иране. В результате духовный лидер Али Хаменеи и некоторые другие руководители армии Ирана были убиты. Но у них заранее были выбраны преемники, способные заменить убитых лидеров. Ракетные установки, огромные склады беспилотников были заранее рассредоточены по обширной территории Ирана в подземных складах и туннелях в скальном грунте, чтобы избежать их уничтожения одним ударом. Иран был готов к удару и имел план навязать США и Израилю войну на истощение. Иран стал наносить удары волнами беспилотников и баллистических ракет по американским базам и радарам в регионе, по территории Израиля, по британской авиабазе на Кипре, по американскому флоту, особенно по американскому авианосцу "Авраам Линкольн", который был вынужден после повреждения баллистическими ракетами ретироваться подальше от территории Ирана. Иран уничтожил несколько американских и израильских самолётов. Иран перекрыл движение танкеров по Ормузскому проливу, что вызвало рост цен в мире на нефть и сжиженный газ. Иран нанёс удар по нескольким танкерам. Перекрытие этого пролива вызвало угрозу голода и жажды в странах Персидского залива, в Кувейте, Бахрейне, Катаре, Объединённых Арабских Эмиратах и Саудовской Аравии, где сельское хозяйство почти отсутствует из-за того, что эти страны находятся в пустыне, где вода добывается на опреснительных станциях из морской воды. Иран нанёс удар по небоскрёбам и гостиницам в странах Персидского залива, которых Иран считал предателями. Иран вёл войну с позиции слабейшей стороны, поэтому был вынужден мужественно терпеть большие потери в ответ на агрессию США и Израиля. Эта война вызвала огромный расход дорогих ракет ПВО и ударных американских ракет, американцам и европейцам стало нечем снабжать Украину ракетами и беспилотниками. Это оказалось выгодно для России в условиях войны на Украине. Пиар Зеленского войны на Украине исчез с телевизионных экранов на Западе, уступив место войне на Ближнем Востоке. Рост цен на нефть и газ на мировом рынке постепенно заставил Запад смягчить санкции против России в торговле этими ресурсами, например, в торговле нефтью России с Индией и Китаем. <ref name="Иран 1" /> Сразу после начала конфликта Россия начала предоставлять Ирану спутниковую информацию о точных координатах американских и израильских кораблей и самолётов. Дроны и баллистические ракеты Тегерана стали поражать объекты с заметно большей точностью. С 2022 года США поставили Украине оружие, включая HIMARS, ATACMS, Patriot и F-16, а также разведданные в реальном времени, позволявшие наносить удары по русским войскам и тыловым объектам. На Ближнем Востоке американские войска попали в капкан наподобие войны во Вьетнаме.Таким образом, геополитический бумеранг вернулся. Помощь Украине обернулась для США риском для собственных кораблей и солдат на Ближнем Востоке. <ref name="Иран 2" />
== Примечания ==
{{Примечания | refs =
<ref name="Бандера 1" >{{Книга | автор = | заглавие = Бандера, Степан Андреевич. Википедия. https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%BD%D0%B4%D0%B5%D1%80%D0%B0,_%D0%A1%D1%82%D0%B5%D0%BF%D0%B0%D0%BD_%D0%90%D0%BD%D0%B4%D1%80%D0%B5%D0%B5%D0%B2%D0%B8%D1%87#%D0%A3%D0%B1%D0%B8%D0%B9%D1%81%D1%82%D0%B2%D0%BE | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Мотоцикл 1" >{{Книга | автор = | заглавие = Штурмовики рассказали о преимуществах атак малыми мотогруппами. https://tvzvezda.ru/news/2024724910-dUys7.html | место = | год = 07.09.24 | издательство = | страницы = | isbn = }}</ref>
<ref name="Гербер 1" >{{Книга | автор = | заглавие = Нас — тьмы, и тьмы, и тьмы. Украину потряс ужас от количества русских ракет.https://dzen.ru/a/aLFoSDThzRdpdUng | место = | год = 29.08.2025 | издательство = Аргументы и факты – aif.ru| страницы = | isbn = }}</ref>
<ref name="Рассвет 1" >{{Книга | автор = | заглавие = Свой Starlink для России. Что умеют спутники «Рассвет» и чем они напугали Украину.https://dzen.ru/a/arnLM4hyeVtz1T2F | место = | год = 28.08.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Дроны 1" >{{Книга | автор = | заглавие = Войска беспилотных систем. Википедия.https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%B9%D1%81%D0%BA%D0%B0_%D0%B1%D0%B5%D1%81%D0%BF%D0%B8%D0%BB%D0%BE%D1%82%D0%BD%D1%8B%D1%85_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Дроны 2" >{{Книга | автор = | заглавие = Беспилотники: следующая война уже идёт в воздухе. https://dzen.ru/a/aeyknRq7NUa5x_eo?sid=6771897967782954 | место = | год = 06.05.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Оптоволокно 1" >{{Книга | автор = | заглавие = Что такое оптоволоконные дроны: особенности и применение. https://www.rbc.ru/base/14/05/2025/68235cf19a7947eaf2d249da?ysclid=mclgquolri683070424#toc-d249da-2 | место = | год = 14.05.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Киллзона 1" >{{Книга | автор = | заглавие = России стало известно о новом плане Киева по созданию киллзоны по всему фронту.https://lenta.ru/news/2026/01/20/rossii-stalo-izvestno-o-novom-plane-kieva-po-sozdaniyu-killzony-po-vsemu-frontu/ | место = | год = 20.01.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Марсианин 1" >{{Книга | автор = | заглавие = Hornet меняет правила игры у российских границ. https://topwar.ru/280760-hornet-menjaet-pravila-igry-u-rossijskih-granic.html | место = | год = 11.04.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Реактивная Герань 1" >{{Книга | автор = Дмитрий Стешин | заглавие = Удары «Гераней» начали переламывать ход СВО: как Россия взломала небо Украины.https://www.kp.ru/daily/277820/5309815/| место = | год = 3.09.2026 | издательство = Комсомольская правда | страницы = | isbn = }}</ref>
<ref name="Роботы 1" >{{Книга | автор = Юлия Леонова, Владимир Матвеев,Богдан Степовой | заглавие = С новым родом: войска беспилотных систем создадут в России. Организационная структура подразделений будет сформирована в будущем году. https://iz.ru/1808177/ulia-leonova-vladimir-matveev-bogdan-stepovoi/s-novym-rodom-voiska-bespilotnyh-sistem-sozdadut-v-rossii | место = | год = 17.12.2024. | издательство = | страницы = | isbn = }}</ref>
<ref name="Блицкриг 1" >{{Книга | автор = Виктор Каменев. | заглавие = «Блицкриг» России и его последствия. https://dzen.ru/a/YoOwwd_EOii9PntE | место = | год = | издательство = | страницы = 17 мая, 2022 | isbn = }}</ref>
<ref name="Калибр 1" >{{Книга | автор = | заглавие = Калибр (крылатая ракета) https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D0%BB%D0%B8%D0%B1%D1%80_(%D0%BA%D1%80%D1%8B%D0%BB%D0%B0%D1%82%D0%B0%D1%8F_%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D0%B0)| место = Википедия | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Искандер 1" >{{Книга | автор = | заглавие = Искандер (ракетный комплекс) https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D0%B0%D0%BD%D0%B4%D0%B5%D1%80_(%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81)| место = Википедия | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Точка 1" >{{Книга | автор = | заглавие =Точка (тактический ракетный комплекс). Википедия. https://ru.wikipedia.org/wiki/%D0%A2%D0%BE%D1%87%D0%BA%D0%B0_(%D1%82%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81) | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Град 1" >{{Книга | автор = | заглавие = Град (РСЗО). Википедия. https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B0%D0%B4_(%D0%A0%D0%A1%D0%97%D0%9E) | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Кинжал 1" >{{Книга | автор = | заглавие = Кинжал (гиперзвуковой ракетный комплекс) https://ru.wikipedia.org/wiki/%D0%9A%D0%B8%D0%BD%D0%B6%D0%B0%D0%BB_(%D0%B3%D0%B8%D0%BF%D0%B5%D1%80%D0%B7%D0%B2%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B9_%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81)| место = Википедия | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Авиация 1" >{{Книга | автор = | заглавие = Из строя выведена почти вся украинская авиация и ПВО, заявил официальный представитель Минобороны России| место = | год = 9 марта 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Азов 1" >{{Книга | автор = | заглавие = Путь позора: как боевики с "Азовстали" сдались в плен. https://ren.tv/news/v-mire/981070-put-pozora-kak-boeviki-s-azovstali-sdalis-v-plen | место = | год = | издательство = | страницы = 30 мая 2022, 03:37 | isbn = }}</ref>
<ref name="Штурмовики 1" >{{Книга | автор = | заглавие = Имперские штурмовики. https://aftershock.news/?q=node/1182776&full| место = | год = 20:51 - 28 Ноября 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Огненный вал 1" >{{Книга | автор = | заглавие = Российская армия применила тактику «огневого вала» под Донецком. https://topwar.ru/199981-rossijskaja-armija-primenila-taktiku-ognevogo-vala-pod-doneckom.html | место = | год = 6 августа 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Отступление 1" >{{Книга | автор = | заглавие = Итоги контрнаступления ВСУ. От Херсона до Харькова. https://rtvi.com/stories/itogi-ukrainskogo-kontrnastupleniya-ot-hersona-do-harkova/ | место = | год = 13.09.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Джевелин 1" >{{Книга | автор = | заглавие = FGM-148 Javelin. Википедия. https://ru.wikipedia.org/wiki/FGM-148_Javelin | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Стингер 1" >{{Книга | автор = | заглавие = FIM-92 Stinger. Википедия. https://ru.wikipedia.org/wiki/FIM-92_Stinger | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Хаймарс 1" >{{Книга | автор = | заглавие = M142 HIMARS. Википедия. https://ru.wikipedia.org/wiki/M142_HIMARS | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Хаймарс 2" >{{Книга | автор = | заглавие = «В ходе разбора завалов»: в Минобороны РФ заявили об увеличении числа погибших в Макеевке военных до 89. https://russian.rt.com/ussr/article/1093799-minoborony-makeevka-pogibshie-voennosluzhaschie?utm_source=yxnews&utm_medium=desktop | место = | год = 4 января 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Хаймарс 3" >{{Книга | автор = | заглавие = «Панцири» и РЭБ помножают на ноль эффективность американских РСЗО: Как сдулся хваленый HIMARS https://dzen.ru/a/ZGeyK1eJqT4DyPaU | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Гарпун 1" >{{Книга | автор = | заглавие = Гарпун (противокорабельная ракета). Википедия.https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%80%D0%BF%D1%83%D0%BD_(%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2%D0%BE%D0%BA%D0%BE%D1%80%D0%B0%D0%B1%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%BA%D0%B5%D1%82%D0%B0) | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Байрахтар 1" >{{Книга | автор = | заглавие = Bayraktar TB2. Википедия. https://ru.wikipedia.org/wiki/Bayraktar_TB2 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="777 1" >{{Книга | автор = | заглавие = 155-мм гаубица M777. Википедия. https://ru.wikipedia.org/wiki/155-%D0%BC%D0%BC_%D0%B3%D0%B0%D1%83%D0%B1%D0%B8%D1%86%D0%B0_M777 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Цезарь 1" >{{Книга | автор = | заглавие = CAESAR (САУ). Википедия. https://ru.wikipedia.org/wiki/CAESAR_(%D0%A1%D0%90%D0%A3) | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Ланцет 1" >{{Книга | автор = | заглавие = ZALA Ланцет. Википедия. https://ru.wikipedia.org/wiki/ZALA_%D0%9B%D0%B0%D0%BD%D1%86%D0%B5%D1%82 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="ДРГ 1" >{{Книга | автор = | заглавие =Недавнее наступление украинской армии — это новый тип наступления. Объясняем подробно Что такое рейд, и почему войны будущего будут состоять в основном из них.https://www.ferra.ru/review/techlife/ukraine-raid.htm | место = | год = 20:27, 13 сентября 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Спутники 1" >{{Книга | автор = | заглавие = Спутники, беспилотники и агентура. Как американская разведка помогает Украине. https://rtvi.com/stories/sputniki-bespilotniki-i-agentura-kak-amerikanskaya-razvedka-pomogaet-ukraine/ | место = | год = 17.05.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Москва 1" >{{Книга | автор = | заглавие = Для уничтожения 13 апреля 2022 г. Крейсера "Москва" США потратили 5 млн.долларов. https://dzen.ru/a/YpkRe1oMZwoGF0vP| место = | год = 3 июня 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Северный поток 1" >{{Книга | автор = | заглавие = Диверсия на «Северных потоках». Википедия. https://ru.wikipedia.org/wiki/%D0%94%D0%B8%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F_%D0%BD%D0%B0_%C2%AB%D0%A1%D0%B5%D0%B2%D0%B5%D1%80%D0%BD%D1%8B%D1%85_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0%D1%85%C2%BB | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Северный поток 2" >{{Книга | автор = | заглавие = Как США взорвали трубопровод "Северный поток". Полный перевод сенсационного расследования Сеймура Херша. Байдена ждёт новый Уотергейт. Перевёл Валерий ЧУМАКОВ https://dzen.ru/a/Y-V4eErMnTmZnRTE | место = | год = 10 февраля 2023 г | издательство = | страницы = | isbn = }}</ref>
<ref name="Эрдоган 1" >{{Книга | автор = | заглавие = Путин предложил Эрдогану создать газовый хаб в Турции. Нужен ли он Европе. Подробнее на РБК:https://www.rbc.ru/business/14/10/2022/6347f9d49a7947dfbedaa0f4 | место = | год = 14 октября 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Крымский мост 1" >{{Книга | автор = | заглавие = Зеленский подтвердил ответственность Киева за теракт на Крымском мосту. https://ren.tv/news/v-mire/1062076-zelenskii-podtverdil-otvetstvennost-kieva-za-terakt-na-krymskom-mostu | место = | год = 01 января 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Армагедон 1" >{{Книга | автор = АЛЬГИРДАС МИКУЛЬСКИС. | заглавие = ТОВАРИЩ АРМАГЕДДОН: ЧТО ИЗВЕСТНО О НОВОМ КОМАНДУЮЩЕМ НА УКРАИНЕ ГЕНЕРАЛЕ СУРОВИКИНЕ. https://tsargrad.tv/articles/tovarishh-armageddon-chto-izvestno-o-novom-komandujushhem-na-ukraine-generale-surovikine_641840 | место = | год = 10 ОКТЯБРЯ 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Герасимов 1" >{{Книга | автор = АНДРЕЙ ПЕРЛА. | заглавие = СКРЫТАЯ ПРАВДА. ПРИЧИНА НАЗНАЧЕНИЯ ГЕРАСИМОВА СТАЛА ИЗВЕСТНА СПУСТЯ СУТКИ. https://tsargrad.tv/articles/skrytaja-pravda-prichina-naznachenija-gerasimova-stala-izvestna-spustja-sutki_703124 | место = | год = 13 ЯНВАРЯ 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Электро 1" >{{Книга | автор = Илья Пламенев. | заглавие = В Киеве заявили о повреждении 40% энергетической инфраструктуры. Подробнее на РБК. https://www.rbc.ru/politics/19/10/2022/6350575c9a7947323ee2be7a | место = | год = 19 октября 2022| издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 1" >{{Книга | автор = Юрий Гаврилов. | заглавие = Минобороны: В теракте в севастопольской бухте были задействованы 9 летательных и 7 автономных морских беспилотников. https://rg.ru/2022/10/30/reg-ufo/terakt-v-krymu-gotovili-britancy.html | место = | год = 30.10.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Зерно 1" >{{Книга | автор = | заглавие = Конец зерновой сделки развязывает руки России. https://dzen.ru/a/ZLUow65tglNWv5lT | место = | год = 17.07.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Мост 1" >{{Книга | автор = | заглавие = Теракт на Крымском мосту. https://www.rbc.ru/society/17/07/2023/64b4bc7d9a79474679b5aefd | место = | год = 17.07.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Суровикин 2" >{{Книга | автор = Казаков Илья. | заглавие = Что сказал Суровикин: полная речь про отвод войск в Херсоне.https://www.fontanka.ru/2022/11/09/71803574/ | место = | год = 9 ноября 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Доты 1" >{{Книга | автор = Анна Сидорова. | заглавие = Дзоты, доты и противотанковые ежи: Россия начала возводить долговременную линию обороны. https://360tv.ru/news/ukrainian-crisis/dzoty-doty-i-protivotankovye-ezhi-rossija-nachala-vozvodit-dolgovremennuju-liniju-oborony/ | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Референдум 1" >{{Книга | автор = | заглавие = Референдумы в ДНР, ЛНР, Херсонской и Запорожской областях. Главное. Подробнее на РБК: https://www.rbc.ru/politics/29/09/2022/6329d5c89a79474c0f7ad167 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Мобилизация 1" >{{Книга | автор = Юрий Гаврилов. | заглавие = Сергей Шойгу подвел итоги мероприятий частичной мобилизации.https://rg.ru/2022/11/01/v-boj-tolko-gotovyh.html | место = | год = 01.11.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="ГКО 1" >{{Книга | автор = | заглавие = Путин поручил создать специальную координационную комиссию (аналог ГКО). https://news-front.info/2022/10/19/putin-poruchil-sozdat-specialnuju-koordinacionnuju-komissiju-analog-gko/ | место = | год = 19.10.2022 15:10| издательство = | страницы = | isbn = }}</ref>
<ref name="Военное положение 1" >{{Книга | автор = Виктория Полякова. | заглавие = Путин ввел военное положение в ДНР, ЛНР, Запорожье и Херсонской области. Подробнее на РБК: https://www.rbc.ru/politics/19/10/2022/634fe3e49a79470992559b62| место = | год = 19 октября 2022 14:48 | издательство = | страницы = | isbn = }}</ref>
<ref name="Вагнер 1" >{{Книга | автор = | заглавие = Мясорубка под Бахмутом: Группа «Вагнера» имеет свою тактику, от которой вздрагивают уже и польские танкисты.https://svodki-s-fronta.com/2022/11/18/miasorybka-pod-bahmytom-gryppa-vagnera-imeet-svou-taktiky-ot-kotoroi-vzdragivaut-yje-i-polskie-tankisty/ | место = | год = 18.11.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Бахмут 1" >{{Книга | автор = | заглавие = "Бахмутский треугольник". Что на самом деле происходит в боях за Артёмовск. https://dzen.ru/a/ZAXNAYdeDwlh8N4n | место = | год = 6 марта 2023.| издательство = | страницы = | isbn = }}</ref>
<ref name="Бахмут 5" >{{Книга | автор = | заглавие = Минобороны подтвердило взятие Артемовска. Путин поздравил участников операции и пообещал наградить отличившихся https://lenta.ru/news/2023/05/21/bakhmut/| место = | год = 21 мая 2023| издательство = | страницы = | isbn = }}</ref>
<ref name="Белгород 2" >{{Книга | автор = | заглавие = ПОСЛЕДСТВИЯ РАКЕТНОГО УДАРА ПО ТОРГОВОМУ ЦЕНТРУ В БЕЛГОРОДЕ 15 ФЕВРАЛЯ 2024 ГОДА.https://www.kp.ru/daily/27567/4891957/| место = | год = 15 февраля 2024 | издательство = Комсомольская правда. | страницы = | isbn = }}</ref>
<ref name="Авдеевка 1" >{{Книга | автор = | заглавие = Российские войска загнали противника в ловушку на Авдеевском направлении. https://ria.ru/20230429/artraschet-1868769137.html| место = | год = 29. 04. 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Угледар 1" >{{Книга | автор = | заглавие =Выяснилось, что не дает двигаться вперед российским частям под Угледаром.https://www.mk.ru/politics/2023/01/31/vyyasnilos-chto-ne-daet-dvigatsya-vpered-rossiyskim-chastyam-pod-ugledarom.html | место = | год =31.01.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Мурадов 1" >{{Книга | автор = Егор Кучер. | заглавие =ИНТРИГА С ОТСТАВКОЙ: СЕКРЕТНАЯ МИССИЯ ОДИОЗНОГО ГЕНЕРАЛА. https://tsargrad.tv/articles/intriga-s-otstavkoj-sekretnaja-missija-odioznogo-generala_751340| место = | год = 28 МАРТА 2023| издательство = | страницы = | isbn = }}</ref>
<ref name="Авиабомба 1" >{{Книга | автор = | заглавие = Россия заставила оттянуться украинскую артиллерию и разрушает систему ПВО: Прорыв в военном деле изменил ход спецоперации. https://www.kp.ru/daily/27495/4755345/| место = | год = 28 апреля 2023| издательство = | страницы = | isbn = }}</ref>
<ref name="Урсула 1" >{{Книга | автор = | заглавие = Глава Еврокомиссии Урсула фон дер Ляйен оценила потери ВСУ с начала конфликта как «свыше ста тысяч». https://topwar.ru/205968-glava-evrokomissii-ursula-fon-der-ljajen-ocenila-poteri-vsu-s-nachala-konflikta-kak-svyshe-sta-tysjach.html | место = | год = 30 ноября 2022| издательство = | страницы = | isbn = }}</ref>
<ref name="Поляки 1" >{{Книга | автор = | заглавие = СМИ Польши сообщают о гибели 1200 поляков-наемников на Украине. https://news-front.info/2022/11/28/smi-polshi-soobshhajut-o-gibeli-1200-poljakov-naemnikov-na-ukraine/ | место = | год =28.11.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Шойгу 2" >{{Книга | автор = | заглавие = Шойгу раскрыл потери России в ходе спецоперации.https://iz.ru/1398679/2022-09-21/shoigu-raskryl-poteri-rossii-v-khode-spetcoperatcii | место = | год = 21 сентября 2022, 09:38 | издательство = | страницы = | isbn = }}</ref>
<ref name="Снарядный голод 1" >{{Книга | автор = Рябов Кирилл | заглавие = Неутолимый снарядный голод: производство снарядов специально для Украины. https://topwar.ru/206257-neutolimyj-snarjadnyj-golod-proizvodstvo-snarjadov-specialno-dlja-ukrainy.html | место = | год = 6 декабря 2022. | издательство = | страницы = | isbn = }}</ref>
<ref name="Путин 1" >{{Книга | автор = | заглавие = Путин назвал конечную цель спецоперации и предложил не говорить о сроках https://www.rbc.ru/politics/29/06/2022/62bcb3ed9a7947423cc41247| место = | год = 29 июня, 23:30 | издательство = | страницы = | isbn = }}</ref>
<ref name="Соледар 1" >{{Книга | автор = | заглавие = "ВАГНЕР" ЗАЧИЩАЕТ КОТЁЛ В СОЛЕДАРЕ: ЧТО ПРОИСХОДИТ НА ФРОНТАХ СВО К ЭТОМУ ЧАСУ.https://tsargrad.tv/news/vagner-zachishhaet-kotjol-v-soledare-chto-proishodit-na-frontah-svo-k-jetomu-chasu_702069 | место = | год = | издательство = | страницы = !2 января 2023 | isbn = }}</ref>
<ref name="Потери 2" > {{Книга | автор = | заглавие = За правду Зеленского четвертуют: Раскрыто, сколько сотен тысяч солдат ВСУ убиты в боях с Россией https://www.kp.ru/daily/27504/4764444/ | место = | год = 18 мая 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Потери 3" > {{Книга | автор = Влад Шлепченко | заглавие = БАХМУТ НАШ! ЗАЧЕМ НУЖНО БЫЛО ЭТО СРАЖЕНИЕ И ЧТО БУДЕТ ДАЛЬШЕ https://tsargrad.tv/articles/bahmut-nash-zachem-nuzhno-bylo-jeto-srazhenie-i-chto-budet-dalshe_785871 | место = | год = 18 МАЯ 2023 02:00 | издательство = | страницы = | isbn = }}</ref>
<ref name="Пэтриот 1" > {{Книга | автор = Алексей Рамм, Богдан Степовой, Роман Крецул | заглавие = «Кинжальная» боль: как был уничтожен американский ЗРК Рatriot https://iz.ru/1513841/aleksei-ramm-bogdan-stepovoi-roman-kretcul/kinzhalnaia-bol-kak-byl-unichtozhen-amerikanskii-zrk-ratriot | место = | год = 17 мая 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Shadow 1" > {{Книга | автор = | заглавие = Британия передала Киеву дальнобойные ракеты Storm Shadow: что известно https://ren.tv/news/v-mire/1102842-britaniia-peredala-kievu-dalnoboinye-rakety-storm-shadow-chto-izvestno | место = | год = 11 мая 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Shadow 2" > {{Книга | автор = | заглавие = Украина впервые применила против России крылатые британские ракеты Storm Shadow https://news.rambler.ru/conflicts/50727698-ukraina-vpervye-primenila-protiv-rossii-krylatye-britanskie-rakety-storm-shadow/ | место = | год = 13 мая 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Бахмут 10" > {{Книга | автор = | заглавие = Стала известна следующая цель ВС РФ и ЧВК "Вагнер" после Бахмута https://overclockers.ru/blog/Xmerc/show/93662/stala-izvestna-sledujuschaya-cel-vs-rf-i-chvk-vagner-posle-bahmuta | место = | год = 19 мая 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Доклад 1" > {{Книга | автор = | заглавие = Британцы по винтикам разобрали русскую армию: Специальный доклад королевских экспертов. https://dzen.ru/a/ZHoX_F2ojEZJTYzG | место = | год = 3 июня 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Циркон 1" >{{Книга | автор = | заглавие = Новая эра во флоте: революция, сравнимая с появлением дредноутов и авианосцев. https://dzen.ru/a/Y7Xb79tsdHkU5S9y | место = | год = 5 января 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Потери 5" >{{Книга | автор = | заглавие = Три дня наступления: названы потери армии России и ВСУ. https://crimea.ria.ru/20230606/tri-dnya-nastupleniya-nazvany-poteri-armii-rossii-i-vsu-1129220508.html | место = | год = 6 июня 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Леопард 1" >{{Книга | автор = | заглавие = Российская авиация оказалась сильнее брони "вундервафли": Дебют сразу восьми немецких "Леопардов" обернулся их сожжением. https://dzen.ru/a/ZH-Nk4XDZU5VHt00 | место = | год = 7 июня 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Герасимов 3" >{{Книга | автор = | заглавие = Глава Генштаба был на «передовом пункте» во время наступления ВСУ. https://lenta.ru/news/2023/06/05/gerasimmov/ | место = | год = 6 июня 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Земледелие 1" >{{Книга | автор = | заглавие = Земледелие (система минирования) https://ru.wikipedia.org/wiki/%D0%97%D0%B5%D0%BC%D0%BB%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D0%B5_(%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)| место = | год = | издательство = Википедия | страницы = | isbn = }}</ref>
<ref name="Леопард 10" >{{Книга | автор = | заглавие = «Я не за миллионами туда ходил и не за наградами»: сибиряк получил первую премию за уничтожение танка «Leopard».https://www.irk.kp.ru/daily/27519/4781627/ | место = | год = 21 июня 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Леопард 20" >{{Книга | автор = | заглавие = Танкисты ВСУ массово отказываются воевать на «Леопардах»: «Ты - смертник». https://www.mk.ru/politics/2023/06/19/tankisty-vsu-massovo-otkazyvayutsya-voevat-na-leopardakh-ty-smertnik.html | место = | год = 19.06.2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Орехов 1" >{{Книга | автор = | заглавие = БИТВА ПОД ОРЕХОВОМ - РУССКИЕ ЖГУТ КОЛОННЫ ВСУ: ЧТО ПРОИСХОДИТ НА ФРОНТАХ СВО. https://tsargrad.tv/news/bitva-pod-orehovym-russkie-zhgut-kolonny-vsu-chto-proishodit-na-frontah-svo_800832 | место = | год = 8 июня 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Контрнаступ 1" >{{Книга | автор = | заглавие = Политолог Вароли рассказал о злости элит США после заявления Путина о потерях ВСУ. https://iz.ru/1530222/2023-06-17/politolog-rasskazal-o-zlosti-elit-ssha-posle-zaiavleniia-putina-o-poteriakh-vsu | место = | год = 17.06.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Контрнаступ 2" >{{Книга | автор = | заглавие = ВСУ с начала контрнаступления потеряли 7500 солдат – Минобороны РФ. https://news-front.info/2023/06/14/vsu-s-nachala-kontrnastuplenija-poterjali-7500-soldat-minoborony-rf/ | место = | год = 14.06.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Контрнаступ 10" >{{Книга | автор = | заглавие = Провал по всем направлениям: Шойгу подвёл итоги контрнаступления Украины.https://dzen.ru/a/ZK15QIxk_xLMqk6Q | место = | год = 11. 07. 2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Контрнаступ 11" >{{Книга | автор = | заглавие = Контрнаступление ВСУ закончилось абсолютно бесславно, заявили в Госдуме | место = | год = 21.09.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Пригожин 1" >{{Книга | автор = | заглавие = Цена несостоявшегося путча. Хроника главных событий мятежа Евгения Пригожина и ЧВК "Вагнер". https://dzen.ru/a/ZJeUG25ZDn0IhnKO | место = | год = 25.06.2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Залужный 1" >{{Книга | автор = | заглавие = Запад сдал Зеленского с потрохами: отставку Залужного в США прямо назвали политической авантюрой. https://www.kp.ru/daily/27565.5/4889254/ | место = | год = 9 февраля 2024 | издательство = Комсомолская правда| страницы = | isbn = }}</ref>
<ref name="Оборона 1" >{{Книга | автор = | заглавие = Зеленский заявил о возведении укреплений по всей Украине. Завершилось ли контрнаступление ВСУ | место = | год = 01 декабря 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Марьинка 1" >{{Книга | автор = | заглавие = Алексей Живов: Россия взяла Марьинку, чтобы выбраться из "воздушного капкана" ВСУ и освободить Херсон. https://ukraina.ru/20231214/1052064550.html | место = | год = 14.12.2023. | издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 2" >{{Книга | автор = | заглавие = "Цезарь Куников" не был последним: Черноморский флот остается в опасности https://dzen.ru/a/Zc341E75bG3jgs09 | место = | год = 16.02.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 3" >{{Книга | автор = | заглавие = Что происходит в Авдеевке и в чем смысл боев за город для обеих сторон. https://dzen.ru/a/Zc4LeLP1mgFYh9hU | место = | год = 16.02.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 4" >{{Книга | автор = | заглавие = МО ОТВЕТИЛО ЗА ПОТОПЛЕННЫЙ РОССИЙСКИЙ КОРАБЛЬ "СЕРГЕЙ КОТОВ", ударив "ИСКАНДЕРОМ" по порту и базе БЭКов https://dzen.ru/a/ZejJ0VwR8nVRQPMv| место = | год = 07.03.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 5" >{{Книга | автор = | заглавие =Кто такой адмирал Моисеев, которого называют новым главкомом ВМФ. https://dzen.ru/a/Ze5l_9DaakUMSoHZ | место = | год =11 марта 2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 6" >{{Книга | автор = | заглавие =Черноморский флот уходит из Севастополя. Если так, то на кону – Одесса и Николаев. https://dzen.ru/a/ZR-sCboM1ne7rnXb | место = | год = 6 октября 2023| издательство = | страницы = | isbn = }}</ref>
<ref name="Вертолёт 1" >{{Книга | автор = | заглавие = ВМФ научился обороне от украинских катеров-камикадзе. https://dzen.ru/a/Zx9MuazAWFrq8thr | место = | год = 28.10.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Флот 7" >{{Книга | автор = Олег Беликов | заглавие ="МОРСКИЕ ПРИЗРАКИ" БЬЮТ ИЗ-ПОД ВОДЫ: ВОСЕМЬ ОФИЦЕРОВ НЕ ВЕРНУЛИСЬ ДОМОЙ. ВРАГ НАЩУПАЛ БРЕШЬ В ОБОРОНЕ. https://tsargrad.tv/articles/morskie-prizraki-bjut-iz-pod-vody-vosem-oficerov-ne-vernulis-domoj-vrag-nashhupal-bresh-v-oborone_1122673 | место = | год = 10.01.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Орион 1" >{{Книга | автор = | заглавие = Крымский мост спасен. Российское чудо-оружие потопит все морские дроны ВСУ. https://dzen.ru/a/Z6vYITanbRLqkhaL | место = | год = 12.02.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Ланцет 2" >{{Книга | автор = | заглавие = Российский «Ланцет» поразил БЭК в Черном море. https://lenta.ru/news/2025/06/04/rossiyskiy-lantset-porazil-bek-v-chernom-more/ | место = | год = 4.06.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="БЭК 1" >{{Книга | автор = | заглавие = «Симферополь» поразили безэкипажно. Российский морской дрон впервые потопил корабль ВМС Украины. https://www.kommersant.ru/doc/7992051| место = | год = 28.08.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Белгород 3" >{{Книга | автор = | заглавие =Почему диверсионные группы ВСУ прекратили попытки зайти в Белгородскую область. https://ura.news/news/1052749637 | место = | год = 30 марта 2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Выборы 1" >{{Книга | автор = | заглавие = Официальные итоги выборов президента России – 2024: главное. https://ren.tv/longread/1202464-ofitsialnye-itogi-vyborov-prezidenta-rossii-2024-glavnoe| место = | год = 21 марта 2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Авдеевка 2" >{{Книга | автор = | заглавие = Что происходит в Авдеевке и в чем смысл боев за город для обеих сторон. https://dzen.ru/a/Zc4LeLP1mgFYh9hU | место = | год = 15.02.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Труба 1" >{{Книга | автор = | заглавие = "Два километра под землёй, удар был страшен": Как русские взломали оборону Авдеевки через тоннель. https://dzen.ru/a/ZbKJ8XoFqAsc1rkH | место = | год = 26. 01.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Авдеевка 3" >{{Книга | автор = | заглавие = Приказ на оставление Авдеевки. Главное на Украине на утро 17 февраля. https://dzen.ru/a/ZdBWkF0N-G_9yY0v | место = | год = 17.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Авдеевка 4" >{{Книга | автор = | заглавие = «Страшно представить, какой ад там творился»: элитная часть ВСУ погибла, не дойдя до Авдеевки? | место = | год = 14.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Авдеевка 5" >{{Книга | автор = | заглавие = Авдеевка теперь - Россия: что происходит в городе после бегства ВСУ. https://dzen.ru/a/ZdBtAF0N-G_9z9Lu | место = | год = 17.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Авдеевка 6" >{{Книга | автор = | заглавие = Минобороны: Сырский приказал оставить Авдеевку после начала бегства ВСУ. https://life.ru/p/1640486 | место = | год = 18.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Мордвичёв 1" >{{Книга | автор = | заглавие = Загадка генерала Мордвичёва: Как "скучный профессор" берёт неприступные города. https://dzen.ru/a/ZdQaowd-DldruKQC | место = | год = 20.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Мордвичёв 2" >{{Книга | автор = | заглавие = "Для генерала Мордвичёва это не назначение – его сняли с должности": Почему военных тревожат новые перестановки. https://dzen.ru/a/aCbxDaaFSU5kuN6P | место = | год = 16.05.2025| издательство = | страницы =| isbn = }}</ref>
<ref name="Мордвичёв 3" >{{Книга | автор = | заглавие = Генерал Мордвичев — новый Жуков? Дойдем ли с ним до Одессы и Днепра. https://news.ru/russia/general-mordvichev-novyj-zhukov-dojdem-li-s-nim-do-odessy-i-dnepra | место = | год = 16.05.2025| издательство = | страницы =| isbn = }}</ref>
<ref name="Мордвичёв 4" >{{Книга | автор = | заглавие = «Генерал Армагеддон» покажется цветочками: СВО теперь займется «Мастер Штурмов» Мордвичев — фронт изменится до неузнаваемости. https://www.hibiny.ru/murmanskaya-oblast/news/item-general-armageddon-pokajetsya-cvetochkami-svo-teper-zaymetsya-master-shturmov-mordvichev-front-izmenitsya-doneuznavae-428286/| издательство = | место = | год = 05.09.2025 | страницы =| isbn = }}</ref>
<ref name="Абрамс 1" >{{Книга | автор = | заглавие = Три "Абрамса", неуловимый "Хаймарс" и редчайшая САУ: российские бойцы жгут лучшую натовскую технику. ВСУ не знают, как уберечь подарки. https://dzen.ru/a/Zeqdv8_2JXncnkxK | место = | год = 08.03.24| издательство = | страницы =| isbn = }}</ref>
<ref name="Коалиция 1" >{{Книга | автор = | заглавие = «Коалиция-СВ» вышла на огневой рубеж. https://zvezdaweekly.ru/news/20241111247-opQEp.html | место = | год = 18 января 2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Коалиция 2" >{{Книга | автор = | заглавие = Самые смертоносные современные САУ — Коалиция-СВ, Archer, CAESAR и другие. https://hi-news.ru/eto-interesno/samye-smertonosnye-sovremennye-sau-koaliciya-sv-archer-caesar-i-drugie.html | место = | год = 14.07.2022| издательство = | страницы =| isbn = }}</ref>
<ref name="Paladin 1" >{{Книга | автор = | заглавие = «Превосходит советские гаубицы»: в ВСУ оценили американскую САУ Paladin. https://topwar.ru/237426-prevoshodit-sovetskie-gaubicy-v-vsu-ocenili-amerikanskuju-sau-paladin.html | место = | год = 29 февраля 2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Коксан 1" >{{Книга | автор = | заглавие = Вместо «Коалиции»: подходит ли САУ M1989 Koksan для контрбатарейной борьбы? https://topcor.ru/55389-vmesto-koalicii-podhodit-li-sau-m1989-koksan-dlja-kontrbatarejnoj-borby.html | место = | год = 8 января 2025 | издательство = | страницы =| isbn = }}</ref>
<ref name="РСЗО 1" >{{Книга | автор = | заглавие = ИЗ КНДР С ЛЮБОВЬЮ. ПОДАРОК КИМ ЧЕН ЫНА НАКОНЕЦ-ТО ДОЕХАЛ ДО ЗОНЫ СВО. https://runews24.ru/articles/09/05/2025/iz-kndr-s-lyubovyu-podarok-kim-chen-yina-nakonecz-to-doexal-do-zonyi-svo | место = | год = 9.05. 2025 | издательство = | страницы =| isbn = }}</ref>
<ref name="Пэтриот 11" >{{Книга | автор = | заглавие = В ДНР уничтожили два американских комплекса Patriot. Как на Украине объяснили, почему редкие системы попали под удар? https://dzen.ru/a/Ze0K9TA0HXGN5PlZ | место = | год = 10.03.24| издательство = | страницы =| isbn = }}</ref>
<ref name="Пэтриот 12" >{{Книга | автор = | заглавие = Путин: Ил-76 с украинскими пленными был сбит американской системой Patriot. https://dzen.ru/a/ZbpZFmuKWSlOMS6L | место = | год = 31.12.23| издательство = | страницы =| isbn = }}</ref>
<ref name="Крынки 1" >{{Книга | автор = | заглавие = Ударная волна из Авдеевки накрыла Крынки: Доклад президенту, о котором не пишут в сводках | место = | год = 23.02.2024| издательство = | страницы =| isbn = }}</ref>
<ref name="Теракт 1" >{{Книга | автор = | заглавие = СК вышел на тех, кто финансировал напавших на "Крокус" террористов. https://ren.tv/news/kriminal/1205070-sk-vyshel-na-tekh-kto-finansiroval-napavshikh-na-krokus-terroristov| место = | год = 29 марта 2024| издательство = | страницы =| isbn = }}</ref>
<ref name="ГУР 1" >{{Книга | автор = | заглавие = "ЦИРКОНОМ" - ПО "ЦЕНТРАМ ПРИНЯТИЯ РЕШЕНИЙ". БУДАНОВ* ПРОПАЛ: УДАР ПО КИЕВУ. О ЧЁМ МОЛЧАТ В СВОДКАХ.https://tsargrad.tv/news/cirkonom-po-centram-prinjatija-reshenij-budanov-propal-udar-po-kievu-o-chjom-molchat-v-svodkah_978227 | место = | год =25 МАРТА 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="ДнепроГЭС 1" >{{Книга | автор = | заглавие =Вся прифронтовая зона со стороны противника была обесточена.https://smotrim.ru/article/3878732 | место = | год =30 МАРТА 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="ДнепроГЭС 1" >{{Книга | автор = | заглавие =Вся прифронтовая зона со стороны противника была обесточена.https://smotrim.ru/article/3878732 | место = | год =30 МАРТА 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Бомба 3000" >{{Книга | автор = | заглавие = РФ впервые применила ФАБ-3000: чем опасна для ВСУ, разрушения, роль в СВО. https://dzen.ru/a/ZnRY-7XgPzOthDwR| место = | год = 20.06.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Бомба 200 км" >{{Книга | автор = | заглавие = Как российская 500-килограммовая авиабомба стала летать на 100 км и более. https://tehnoomsk.ru/archives/21487| место = | год = 21.10.2025 | издательство = | страницы =| isbn = }}</ref>
<ref name="Бомба 1500" >{{Книга | автор = | заглавие = Высокоточные царь-бомбы. "Ночью в кабине самолёта становится светло, как днём". ОДАБ-1500, ФАБ-1500 и мощные кассетные бомбы получили УМПК. https://dzen.ru/a/ZaJLM7MmlmTVUbTL| место = | год = 14 января 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Работино 1" >{{Книга | автор = Любовь Степушова | заглавие = Взятие Работина армией России имеет символическое и практическое значение. https://military.pravda.ru/2019751-rabotino/|место = | год = 15.05.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Часов Яр 1" >{{Книга | автор = | заглавие = Укрепления, способные выдержать ядерный взрыв: с чем столкнутся ВС РФ в битве за Часов Яр. https://ukraina.ru/20240404/1054306657.html | год = 04.04.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Очеретино 1" >{{Книга | автор = | заглавие = Фронт ВСУ посыпался. ВС РФ задумали операцию грандиозней авдеевской. https://military.pravda.ru/1999687-ocheretino/ | год = 17.04.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Волчанск 1" >{{Книга | автор = | заглавие = Бои в Харьковской области 17 мая: успехи и проблемы ВС РФ, сводка сегодня. https://news.ru/world/boi-v-harkovskoj-oblasti-17-maya-uspehi-i-problemy-vs-rf-svodka-segodnya/ | год = 17 мая 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Красногоровка 1" >{{Книга | автор = | заглавие = Битва за Красногоровку: ВСУ цепляются за последние укрепления, в большей части города идёт зачистка.https://news.rambler.ru/army/52771177-bitva-za-krasnogorovku-vsu-tseplyayutsya-za-poslednie-ukrepleniya-v-bolshey-chasti-goroda-idet-zachistka/ | год = 17 мая 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Купянск 1" >{{Книга | автор = | заглавие = Поддали огоньку гадам. ВС РФ идут к Купянску и гонят нацистов ВСУ в реку. https://aif.ru/politics/russia/poddali-ogonku-gadam-vs-rf-idut-k-kupyansku-i-gonyat-nacistov-vsu-v-reku | год = 16.05.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Сумы 1" >{{Книга | автор = | заглавие = Сумы – наш! Русские войска открыли новый фронт в СВО. Режим "зрадо-перемоги" активирован. https://dzen.ru/a/ZmcFtvYwUHhn_RAK | год = 10.06.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Волчанск 2 " >{{Книга | автор = | заглавие = Польское СМИ: наступление России под Харьковом — операция по отвлечению внимания.https://bel.ru/news/2024-08-02/polskoe-smi-nastuplenie-rossii-pod-harkovom-operatsiya-po-otvlecheniyu-vnimaniya-5156253 | год = 2.08.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Белоусов 1" >{{Книга | автор = | заглавие = Две отставки, два ареста. Что дальше будет с "командой Шойгy"?https://dzen.ru/a/ZkOz-P3bwX6gLM4t | год = 14.05.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Беспилотник 1" >{{Книга | автор = | заглавие = ПОЛИТИЧЕСКОЕ РЕШЕНИЕ УЖЕ ПРИНЯТО: ЧТО НУЖНО ВОЕННЫМ, ЧТОБЫ СБИВАТЬ АМЕРИКАНСКИЕ ДРОНЫ-РАЗВЕДЧИКИ. https://tsargrad.tv/articles/politicheskoe-reshenie-uzhe-prinjato-chto-nuzhno-voennym-chtoby-sbivat-amerikanskie-drony-razvedchiki_1022055| год = 06 ИЮЛЯ 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Полтава 1" >{{Книга | автор = | заглавие = Командир ВСУ Ярославский: Россия уничтожила в Полтаве элитных пилотов https://aif.ru/society/komandir-vsu-yaroslavskiy-rossiya-unichtozhila-v-poltave-elitnyh-pilotov| год = 07.09. 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Маринеско 1" >{{Книга | автор = | заглавие = Атака века. Одна ракета уничтожила сотни специалистов ВСУ и НАТО в Полтаве https://dzen.ru/a/Ztd7oqfqUCkjWQV2| год = 04.09. 2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Марчак" >{{Книга | автор = | заглавие = Эксперт Марочко оценил вероятность гибели польского генерала Марчака на Украине. https://www.mk.ru/politics/2024/03/27/ekspert-marochko-ocenil-veroyatnost-gibeli-polskogo-generala-marchaka-na-ukraine.html| место = | год = 27.03.2024 | издательство = | страницы =| isbn = }}</ref>
<ref name="Пленные 1" >{{Книга | автор = | заглавие = "Черти" и наёмники Зеленского и пессимизм украинцев, обмен пленными. Итоги 24 августа на Украине https://dzen.ru/a/Zspun24NLi--vMPD | год = 24.08.2024. | издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 1" >{{Книга | автор = | заглавие = "Давно не видел президента таким злым": О смене начальника Генштаба впервые заговорили военкоры после вторжения ВСУ в Курск https://dzen.ru/a/ZrXABRJirVnetKh9| место = | год = 9.08. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 2" >{{Книга | автор = | заглавие = Эшелоны под Курском, из Генштаба озвучен доклад. Военкоры не стерпели: "Вспоминается череда лжи"https://dzen.ru/a/ZraEus7WAUduXkX_ | место = | год = 10.08.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Дюмин 1" >{{Книга | автор = | заглавие = "Засады, огневые налёты, рейды по тылам": С чем столкнётся Дюмин на русско-украинском пограничье https://novorosinform.org/zasady-ognevye-nalety-rejdy-po-tylam-s-chem-stolknetsya-dyumin-na-russko-ukrainskom-pograniche-127483.html| место = | год = 15.08.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Резервы 1" >{{Книга | автор = | заглавие = "Всё очень грустно, без преувеличения": 35 км до полной катастрофы - Киев отправил новые резервы под Курск. Город "вычищен" https://tsargrad.tv/news/vse-ochen-grustno-bez-preuvelichenija-35-km-do-polnoj-katastrofy-kiev-otpravil-novye-rezervy-pod-kursk-gorod-vychishhen_1040736 | место = | год = 15.08.2024| издательство = | страницы = | isbn = }}</ref>
<ref name="КТО 1" >{{Книга | автор = | заглавие = Самый масштабный режим КТО в истории: зачем его ввели в Курской и еще двух областях https://dzen.ru/a/ZrcfS87WAUdueWcF | место = | год = 10.08.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Рогозин 1" >{{Книга | автор = | заглавие = Рогозин призвал не брать в плен напавших на Курскую область боевиков https://www.sila-rf.ru/2024/08/07/rogozin-prizval-ne-brat-v-plen-napavshih-na-kurskuyu-oblast-boevikov/ | место = | год = 7.08.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 3" >{{Книга | автор = | заглавие = Бьют ВСУ. МО России раскрыло последние новости о ситуации в Курской области https://aif.ru/politics/russia/byut-vsu-mo-rossii-raskrylo-poslednie-novosti-o-situacii-v-kurskoy-oblasti | место = | год = 25.08.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Капкан 1" >{{Книга | автор = | заглавие = Курский капкан Украины https://dzen.ru/a/ZtIVfnrbCR8n03iM| место = | год = 30.08.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 4" >{{Книга | автор = | заглавие = Минобороны: ВС РФ за двое суток освободили 10 населенных пунктов Курской области. https://www.1tv.ru/news/2024-09-12/485979-minoborony_vs_rf_za_dvoe_sutok_osvobodili_10_naselennyh_punktov_kurskoy_oblasti | место = | год = 12. 09.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 5" >{{Книга | автор = | заглавие = Forbes: ВСУ потеряли большое количество бронетехники, попав в засаду ВС России в районе села Весёлое Курской области. https://topwar.ru/251719-forbes-vsu-poterjali-bolshoe-kolichestvo-bronetehniki-popav-v-zasadu-vs-rossii-v-rajone-sela-veseloe.html| место = | год = 11. 10.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 6" >{{Книга | автор = | заглавие = Стало известно о начале второй фазы контрнаступления в Курской области. https://news.ru/regions/stalo-izvestno-o-nachale-vtoroj-fazy-kontrnastupleniya-v-kurskoj-oblasti/ | место = | год = 10. 10.2024.| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 7" >{{Книга | автор = | заглавие = ВСУ в Ольговской роще попали в котел нового типа https://vz.ru/society/2024/11/20/1298980.html | место = | год = 20.11. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 8" >{{Книга | автор = Юрий Подоляка | заглавие = Война на Украине Курское сражение Уже не «контрнаступ», но активная оборона.https://www.yandex.ru/video/preview/11048383809592515901 | место = | год = 10.01.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 9" >{{Книга | автор = | заглавие = Остатки ВСУ в Курской области теряют связь с Украиной. https://dzen.ru/a/Z7y9SFGVMiY1WWhE | место = | год = 24.02.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 10" >{{Книга | автор = | заглавие = Стали известны все детали операции «Труба», о которой доложили Путину. https://dzen.ru/a/Z9CC6sZ5tHURlHr1 | место = | год = 11.03.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 11" >{{Книга | автор = | заглавие = Путин в Курской области заслушал доклад Герасимова о поражении ВСУ. Главное.https://www.kommersant.ru/doc/7566159?from=doc_vrez | место = | год = 12.03.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 12" >{{Книга | автор = | заглавие = Трамп попросил Путина пощадить окруженных в Курской области ВСУшников. https://www.kp.ru/daily/27673.5/5061805/ | место = | год = 14.03.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 13" >{{Книга | автор = | заглавие = Украинские военные осуществляли геноцид населения Курской области. https://anna-news.info/ukrainskie-voennye-osushhestvlyali-genotsid-naseleniya-kurskoj-oblasti/ | место = | год = 15.03.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 14" >{{Книга | автор = | заглавие = "Пленных не брать": Приказ распространён не только на Курскую область? https://dzen.ru/a/Z6OMOxhTnwUHKvJu | место = | год = 5.02.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 15" >{{Книга | автор = | заглавие = ВС РФ освободили Курскую область: итоги, потери ВСУ, сколько жертв. https://dzen.ru/a/aAzBS80DSRxcj-n2 | место = | год = 26.04.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 16" >{{Книга | автор = | заглавие = Западные СМИ занервничали после заявлений о войсках Ким Чен Ына под Курском. https://dzen.ru/a/aA-RMc0DSRxcVK96 | место = | год = 28.04.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Курск 17" >{{Книга | автор = | заглавие = Раскрыты потери среди солдат КНДР в боях под Курском. https://life.ru/p/1748298 | место = | год = 30.04.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Новгородское 1" >{{Книга | автор = | заглавие = ВС России завершили освобождение Нью-Йорка (Новгородское) и начали штурм Нелеповки https://topwar.ru/248437-vs-rossii-zavershili-osvobozhdenie-nju-jorka-novgorodskoe-i-nachali-shturm-nelepovki.html | место = | год = 19.08. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Покровск 1" >{{Книга | автор = | заглавие = Хроника СВО: возможное обрушение фронта на покровском направлении и продолжение КТО в Курской области https://www.bfm.ru/news/557159| место = | год = 30.08. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Энерго 1" >{{Книга | автор = | заглавие = БЕССИЛИЕ ПЕРЕД СТИХИЕЙ. УДАРЫ ПО КИЕВСКОЙ ГЭС ПРИВЕДУТ К УНИЧТОЖЕНИЮ УКРАИНСКОЙ СТОЛИЦЫ. https://runews24.ru/articles/29/08/2024/bessilie-pered-stixiej-udaryi-po-kievskoj-ges-privedut-k-unichtozheniyu-ukrainskoj-stoliczyi| место = | год = 29.08. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Ф 16" >{{Книга | автор = | заглавие = Первый F-16 разбился на Украине: что произошло на самом деле? Разбираемся в скандале https://dzen.ru/a/ZtG8KDD0MDzbbw-a| место = | год = 29.08. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Угледар 2" >{{Книга | автор = | заглавие = Армия России освободила Угледар: как проходил его штурм и чем важен город. https://dzen.ru/a/Zv098WR3LlJwkKQH| место = | год = 2.10. 2024| издательство = | страницы = | isbn = }}</ref>
<ref name="Герой 1" >{{Книга | автор = | заглавие = Грудью на амбразуру. Бойцов, взорвавших «опорник» врага, не считают героями. https://dzen.ru/a/ZozMSARNLicfoLBO | место = | год = 9.07.2024 | издательство = Аргументы и факты | страницы = | isbn = }}</ref>
<ref name="Штурм 1" >{{Книга | автор = | заглавие = Александр Полищук: Чем СВО отличается от Великой Отечественной войны и где у них совпадения. https://dzen.ru/a/ZxsIA4Cwz0DT3QzM | место = | год = 25.10.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Курахово 1" >{{Книга | автор = | заглавие = ВС РФ уничтожают и вытесняют остатки подразделений противника из кармана севернее Антоновки на Кураховском направлении https://topwar.ru/254243-vs-rf-prodolzhajut-vytesnjat-protivnika-iz-karmana-severnee-antonovki-na-kurahovskom-napravlenii.html| место = | год = 22.11.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Курахово 2" >{{Книга | автор = | заглавие = Кульминацией освобождения Курахово стал российский флаг, водружённый на Кураховской ТЭС. https://topwar.ru/256810-kulminaciej-osvobozhdenija-kurahovo-stal-rossijskij-flag-vodruzhennyj-na-kurahovskoj-tjes.html | место = | год = 1.01.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Курахово 3" >{{Книга | автор = | заглавие = Российским войскам открылась дорога на Днепр. https://dzen.ru/a/Z3wVWybj0llJkEux| место = | год = 6.01.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Купянск 2" >{{Книга | автор = | заглавие = Наши ворвались в Купянск: «Солнцепек» пробил русским штурмовикам коридор, украинская контрразведка допрашивает генералов https://news.rambler.ru/army/53744384-nashi-vorvalis-v-kupyansk-solntsepek-probil-russkim-shturmovikam-koridor-ukrainskaya-kontrrazvedka-doprashivaet-generalov/| место = | год = 14.11.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Новосёлка 1" >{{Книга | автор = | заглавие = «Клещи сжимаются»: Остатки ВСУ в Великой Новосёлке на грани окружения. https://life.ru/p/1716178| место = | год = 29.12.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Новосёлка 2" >{{Книга | автор = Алексей Рыбин | заглавие = ВС России освободили Великую Новоселку в ДНР. https://dzen.ru/a/Z5ZDGijkvzNlzz45?utm_source=yxnews&utm_medium=desktop | место = | год = 26.01.2025| издательство = | страницы = | isbn = }}</ref>
<ref name="Дзержинск 1" >{{Книга | автор = | заглавие = Российские войска освободили город Дзержинск в ДНР. https://rg.ru/2025/02/07/rossijskie-vojska-osvobodili-gorod-dzerzhinsk-v-dnr.html?utm_source=yxnews&utm_medium=desktop&utm_referrer=https%3A%2F%2Fdzen.ru%2Fnews%2Fstory%2F4aaa7409-3a89-51c7-a70b-7b06c9b46c87 | место = | год =07.02.2025. | издательство = | страницы = | isbn = }}</ref>
<ref name="Орешник 1" >{{Книга | автор = | заглавие = Ответ РФ на удары вглубь России и новая ракета. Что сказал Путин в видеообращении https://tass.ru/politika/22466809?utm_source=yxnews&utm_medium=desktop&utm_referrer=https%3A%2F%2Fdzen.ru%2Fnews%2Fstory%2Fd348276f-a670-53bd-bc69-ca88e334cf89 | место = | год = 21.11.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Часов Яр 2" >{{Книга | автор = | заглавие = Освобождение Часова Яра. Рувики. https://ru.ruwiki.ru/wiki/%D0%9E%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A7%D0%B0%D1%81%D0%BE%D0%B2%D0%B0_%D0%AF%D1%80%D0%B0#cite_ref-:3_4-1 | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Котлы 1" >{{Книга | автор = | заглавие = Андрей Клинцевич: Российские войска продолжают наступление, выстраивая тактику окружения через малые котлы — Покровск, Константиновка, Северск и Купянск. https://news-dnepr.ru/other/2025/07/28/104884.html | место = | год = 28.07.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Доброполье 1" >{{Книга | автор = | заглавие = «Инфильтрация мелких групп»: Командование группировки «Днепр» ВСУ отказывается признавать прорыв обороны к востоку от Доброполья. https://topwar.ru/269533-infiltracija-melkih-grupp-komandovanie-gruppirovki-dnepr-vsu-otkazyvaetsja-priznavat-proryv-oborony-k-vostoku-ot-dobropolja.html | место = | год = 30.08.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Купянск 10" >{{Книга | автор = | заглавие = Тысячи бойцов в окружении: Путину доложили о «котлах» в Купянске и Покровске – намечается операция «Экстракшн» https://www.mk.ru/politics/2025/10/26/tysyachi-boycov-v-okruzhenii-putinu-dolozhili-o-kotlakh-pod-kupyanskom-i-pokrovskom-namechaetsya-operaciya-ekstrakshn.html | место = | год = 26.10.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Гуляйполе 10" >{{Книга | автор = | заглавие = «Генералитет отвлекся на Покровск». На Украине рвут и мечут — как Сырский прозевал наступление в Запорожье. https://dzen.ru/a/aRiShJmXjixmeXCW | место = | год = 15.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Купянск 11" >{{Книга | автор = | заглавие = Наступление ВС РФ на Харьков 21 ноября: бои в трубах, планы после Купянска. https://dzen.ru/a/aSApsVJLY2cMDe2U | место = | год = 21.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Волчанск 10" >{{Книга | автор = | заглавие = "ПОКРОВСК И ВОЛЧАНСК НАШИ": ВСКРЫТ НАГЛЫЙ ОБМАН. ДАЛЬШЕ БУДЕТ ТОЛЬКО ХУЖЕ. https://tsargrad.tv/articles/pokrovsk-i-volchansk-nashi-vskryt-naglyj-obman-dalshe-budet-tolko-huzhe_1463195 | место = | год = 2.12.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Северск 1" >{{Книга | автор = | заглавие = Владимиру Путину доложили о полном переходе Северска под российский контроль. https://www.1tv.ru/news/2025-12-11/528345-vladimiru_putinu_dolozhili_o_polnom_perehode_severska_pod_rossiyskiy_kontrol | место = | год = 11.12.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Гуляйполе 11" >{{Книга | автор = | заглавие = Путин оценил продвижение ВС РФ на передовой: «есть чем порадовать граждан». https://dzen.ru/a/aVCQQtSrMzjMizJ8?utm_source=yxnews&utm_medium=desktop| место = | год = 28.12.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Кланы 1" >{{Книга | автор = | заглавие = "Генерал-катастрофа" против Суровикина: В Генштабе развернулась борьба кланов? Суть вопроса. https://dzen.ru/a/aNgsvUL3RQGGE46R | место = | год = 28.09.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Санчик 2" >{{Книга | автор = | заглавие = Отличился в первые дни СВО: что известно о замглавы минобороны РФ Александре Санчике. https://vfokuse.mail.ru/article/sanchik-68643432/ | место = | год = 9.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Карлсон 1" >{{Книга | автор = | заглавие = Пазлы сложились: США вскрыли воровскую империю Зеленского, чтоб он пошел на мир до конца ноября. https://www.kp.ru/daily/27745/5172946/ | место = | год = 20.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Ермак 1" >{{Книга | автор = | заглавие = Что отставка Ермака значит для Зеленского и переговоров по мирному плану Он входил в ближайшее окружение президента Украины с 2019 года. https://www.rbc.ru/politics/28/11/2025/6929e0209a79473455347e01 | место = | год = 28.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Дезертиры 1" >{{Книга | автор = | заглавие = Украинцы начали активно сотрудничать с РФ и присылать координаты ТЦК: как и почему это происходит.https://news.mail.ru/svo/68465944/| место = | год = 26.10.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Дезертиры 2" >{{Книга | автор = Иан Прауд (Ian Proud) | заглавие = “Бусификация” — лишь верхушка украинского айсберга. https://inosmi.ru/20251104/busifikatsiya-275474716.html| место = | год = 4.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Орешник 2" >{{Книга | автор = | заглавие = Шок и непонимание: удар "Орешником" по Украине потряс европейцев. https://ren.tv/news/v-mire/1396511-shok-i-neponimanie-udar-oreshnikom-po-ukraine-potrias-evropeitsev| место = | год = 9.01.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Константиновка 1" >{{Книга | автор = Дарья Петуненкова| заглавие = Железная ловушка: остатки ВСУ в Константиновке сгорают в тупике без остатка.https://aif.ru/society/zheleznaya-lovushka-ostatki-vsu-v-konstantinovke-sgorayut-v-tupike-bez-ostatka | место = | год = 13.06.2026 | издательство = Аргументы и факты | страницы = | isbn = }}</ref>
<ref name="Константиновка 2" >{{Книга | автор =| заглавие = Почему важна освобожденная Константиновка: Российская армия лишила Киев главного щита перед битвой за Краматорск и Славянск. https://www.kp.ru/daily/277794/5271428/| место = | год = 4.07.2026 | издательство = Комсомольская правда | страницы = | isbn = }}</ref>
<ref name="Лиман 1" >{{Книга | автор = Кристина Куракина | заглавие = Посыпалась важная крепость ВСУ: главная новость СВО 21 июня. https://aif.ru/society/posypalas-vazhnaya-krepost-vsu-glavnaya-novost-svo-21-iyunya | место = | год = 21.06.2026 | издательство = Аргументы и факты | страницы = | isbn = }}</ref>
<ref name="Орехов 2" >{{Книга | автор = | заглавие = «Неприступный» Орехов: Крепость, которая пала. Как российские бойцы сломали оборону ВСУ. https://dzen.ru/a/aqQSy4DLTiGUG9hI?sid=187813004327263082 | место = | год = 11.09.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Волчанский котёл 1" >{{Книга | автор = | заглавие = Опубликована карта окружения ВСУ в Харьковской области. https://rg.ru/2026/09/09/opublikovana-shema-harkovskogo-kotla-vsu.html?utm_referrer=https%3A%2F%2Fyandex.ru%2F | место = | год = 09.09.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Волчанский котёл 2" >{{Книга | автор = | заглавие = Сводка СВО, 19 сентября. Группировку ВСУ режут на куски в харьковском котле: счет убитым идет на сотни. https://dzen.ru/a/aq6uPB3cWgqrOo-F | место = | год = 19.09.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Доброполье 3" >{{Книга | автор = | заглавие = Никакие «фортеции» не спасут! Оборона Донбасса захлебнулась: элита ВСУ горит в смертельном котле в Доброполье — на очереди еще два. https://dzen.ru/a/arWr284BhR87G4M2?sid=177214497743465777 | место = | год = 25.09.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Вивальди 1" >{{Книга | автор = | заглавие = Как по нотам: почему у ВСУ получилось локальное контрнаступление? https://topcor.ru/74549-kak-po-notam-pochemu-u-vsu-poluchilos-lokalnoe-kontrnastuplenie.html | место = | год = 30.09.26 | издательство = | страницы = | isbn = }}</ref>
<ref name="Киев 1" >{{Книга | автор = | заглавие = Коммунальная катастрофа на Украине: решается судьба страны. https://inosmi.ru/20260123/otoplenie-276773680.html| место = | год = 23.01.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Киев 2" >{{Книга | автор = | заглавие = «Холодная война» против Киева: время выбрано идеально. https://topcor.ru/67928-holodnaja-vojna-protiv-kieva-vremja-vybrano-idealno.html| место = | год = 21.01.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Электро 10" >{{Книга | автор = | заглавие = Внезапно! Все АЭС Украины впервые остановлены. Жесточайший удар по Украине. Последний этап операции. Сотни французов – "200" https://dzen.ru/a/aYfuURD7VhuwaZH- | место = | год = 8.02.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Дроны 3" >{{Книга | автор = | заглавие = Уроки СВО: как сломать экономику с помощью фанеры, картона и чипа. https://dzen.ru/a/af1brlU4_3gzM279?sid=112564838511168830 | место = | год = 08.05.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="НПЗ 1" >{{Книга | автор = | заглавие = Атаки на НПЗ обрушили нефтепереработку РФ ниже 4 млн б/с. https://meo.ru/news/ataki-na-npz-obrushili-neftepererabotku-rf-2026-08-12 | место = | год = 12.08.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Старобельск 1" >{{Книга | автор = | заглавие = Россия нанесла удар возмездия «Кинжалами» и «Орешником» по Украине за Старобельск. https://www.pfo-perm.ru/rossiya/rossiya-nanesla-udar-vozmezdiya-rossiya-nanesla-massirovannyj-udar-kinzhalami-i-oreshnikom-po-ukraine-posle-gibeli-21-cheloveka-v-starobelskeza-starobelsk-kinzhalami/ | место = | год = 30.05.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Блокада 1" >{{Книга | автор = | заглавие = Первые результаты блокады одесских портов. https://anna-news.info/pervye-rezultaty-blokady-odesskih-portov/ | место = | год = 09.08.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Блокада 2" >{{Книга | автор = | заглавие = Мост, который кормил ВСУ. Как российские удары по киевским артериям изменят ход СВО. https://dzen.ru/a/asGixIwtABJAuUc- | место = | год = 04.09.2026 | издательство = | страницы = | isbn = }}</ref>
<ref name="Путин 2" >{{Книга | автор = | заглавие = Путин предупредил о последствиях ввода войск НАТО на Украину. https://crimea.ria.ru/20221014/putin-predupredil-o-posledstviyakh-vvoda-voysk-nato-na-ukrainu-1124890655.html | место = | год = 16:26 14.10.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Китай 1" >{{Книга | автор = | заглавие = Китай вновь выступил против антироссийских санкций США. https://rg.ru/2022/03/17/knr-vystupaet-protiv-antirossijskih-sankcij-ssha.html| место = | год = 17.03.2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Истощение" >{{Книга | автор = | заглавие = Мировое обозрение. «Война на истощение»: рассмотрим варианты сторон украинского конфликта: https://tehnowar.ru/358536-%C2%ABVoyna-na-istoschenie%C2%BB-rassmotrim-varianty-storon-ukrainskogo-konflikta.html| место = | год = 30 декабря 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Нефть 1" >{{Книга | автор = | заглавие = Страны Запада установили потолок цен на российскую нефть. Что это значит. https://www.rbc.ru/business/02/12/2022/637dd9519a7947da0e7dd7b5| место = | год = 02 декабря 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Нефть 2" >{{Книга | автор = | заглавие = Указ Президента Российской Федерации от 27 декабря 2022 года № 961 "О применении специальных экономических мер в топливно-энергетической сфере в связи с установлением некоторыми иностранными государствами предельной цены на российские нефть и нефтепродукты" https://rg.ru/documents/2022/12/27/prezident-ukaz961-site-dok.html| место = | год = 27 декабря 2022 | издательство = | страницы = | isbn = }}</ref>
<ref name="Хамас 1" >{{Книга | автор = | заглавие = Ад и Израиль: как война на Ближнем Востоке повлияет на Украину
Эксперты рассказали о последствиях вспыхнувшего конфликта https://iz.ru/1586612/bogdan-lvovskii/ad-i-izrail-kak-voina-na-blizhnem-vostoke-povliiaet-na-ukrainu| место = | год = 10 октября 2023 | издательство = | страницы = | isbn = }}</ref>
<ref name="Газ 1" >{{Книга | автор = | заглавие = Транзит газа через Украину остановлен. Что дальше? https://rg.ru/2025/01/01/tranzit-gaza-cherez-ukrainu-ostanovlen-chto-dalshe.html| место = | год = 1.01.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Газ 2" >{{Книга | автор = | заглавие =Более чем полувековые газовые отношения закончились: «Газпром» прекратил поставлять голубое топливо в Австрию из-за многомиллионного долга. https://dzen.ru/a/Z0R_ypjj6SvMFOig | место = | год = 25.11.2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Газ 3" >{{Книга | автор = | заглавие ="Газпром", долги и манёвры Кишинёва: как Кишинёв перекладывает свои долги на Тирасполь.https://dzen.ru/a/Z3YgU5w91QFdWzAj | место = | год = 2.01.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Трамп 1" >{{Книга | автор = | заглавие = Результаты выборов президента США в 2024 год: кто станет 47-м президентом. https://news.mail.ru/politics/63533354/| место = | год = 7 ноября 2024 | издательство = | страницы = | isbn = }}</ref>
<ref name="Трамп 2" >{{Книга | автор = Андрей Зобов | заглавие = Чем закончились переговоры России и США: Вашингтон заговорил об уступках, а Москва назвала диалог «позитивным» https://www.kp.ru/daily/27662/5050865/| место = | год = 18 февраля 2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Трамп 3" >{{Книга | автор = | заглавие = Трамп вышвырнул Зеленского: чем обернется скандал в Белом доме. https://ren.tv/news/politika/1312279-tramp-vyshvyrnul-zelenskogo-chem-obernetsia-skandal-v-belom-dome| место = | год = 1 марта 2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Трамп 4" >{{Книга | автор = | заглавие = «Это не уступка, а реальность»: в США оценили позицию Трампа по Украине. https://dzen.ru/a/Z7Ii-6hB9HpVOldm| место = | год = 16 февраля 2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Трамп 5" >{{Книга | автор = | заглавие = Госдеп: США официально вышли из переговорного процесса по Украине. https://topcor.ru/59415-gosdep-ssha-oficialno-vyshli-iz-peregovornogo-processa-po-ukraine.html| место = | год = 2.05 2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Аляска 1" >{{Книга | автор = | заглавие = Саммит Россия — США на Аляске (2025)https://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%BC%D0%BC%D0%B8%D1%82_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F_%E2%80%94_%D0%A1%D0%A8%D0%90_%D0%BD%D0%B0_%D0%90%D0%BB%D1%8F%D1%81%D0%BA%D0%B5_(2025)| место = Википедия | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Буревестник 1" >{{Книга | автор = | заглавие = "Посейдон" и "Буревестник" с ядерными двигателями: Что у них общего и как это работает. https://rg.ru/2025/10/31/burevestnik-i-posejdon-stanoviatsia-groznoj-realnostiu-v-nebe-i-pod-vodoj.html| место = | год = 08.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Посейдон 1" >{{Книга | автор = | заглавие = «Буревестник» и «Посейдон» – оружие деэскалации. https://vz.ru/opinions/2025/11/6/1371522.html| место = | год = 06.11.2025 | издательство = | страницы = | isbn = }}</ref>
<ref name="Томагавк 1" >{{Книга | автор = Арпине Асатрян | заглавие = Трамп исключил возможность поставок Киеву ракет Tomahawk. https://www.forbes.ru/society/549143-tramp-isklucil-vozmoznost-postavok-kievu-raket-tomahawk| место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Иран 1" >{{Книга | автор = ВЛАД ШЛЕПЧЕНКО| заглавие = Спутниковые снимки раскрыли главную победу Ирана: Американская ПРО уничтожена? https://dzen.ru/a/aapRjwLFUhfRlL9f | место = | год = | издательство = | страницы = | isbn = }}</ref>
<ref name="Иран 2" >{{Книга | автор = | заглавие = Наступила расплата. Россия с лихвой ответила США за помощь Украине. https://dzen.ru/a/aa3yaALFUhfRmFHX | место = | год = 9 марта 2026 | издательство = | страницы = | isbn = }}</ref>
}}
cfph7buh99f40skjgv6fzzkw0ewp43d
Некоторые сведения о Perl 5/Операции и выражения
0
30390
270321
270320
2026-10-09T12:57:05Z
ScriptMaster
15708
/* Диапазон */
270321
wikitext
text/x-wiki
{{Навигация учебника}}
''Операция'' — это некоторые действия над операндами, результатом которых является новое значение. В Perl есть десятки операций, большинство из которых мы рассмотрим в этой главе, а другие в последующих. Операции можно делить по типу выполняемых ими действий (например, арифметические, логические и т.д.), по объекту, на который они воздействуют (строковые, списковые, файловые), а иной раз сложно отнести их к какой-то категории.
Большинство операций работает с двумя операндами, которые записываются по обе стороны от знака операции (''бинарная операция''). Например в операции сложения операндами выступают слагаемые. Для других операций может требоваться один операнд (''унарная операция'') или три (''тернарная операция''). В некоторых операциях какие-то операнды можно опускать.
Серия операций, записанная единым куском образует ''выражение''. Любое выражение интерпретируется слева направо, при этом порядок исполнения операций внутри выражения зависит от приоритета операций. Приоритеты операций в выражении можно менять через круглые скобки, которые дают более высокий приоритет.
== Арифметические операции ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Арифметические операции'''</center>
|-
|<center><code>+</code></center>
|style="width:10%;"|<center><code>6.35+8.31</code></center>
|style="width:30%;"|'''Сложение'''. Выполняет арифметическое сложение
|<center><code>-</code></center>
|style="width:10%;"|<center><code>9.15-5</code></center>
|style="width:30%;"|'''Вычитание'''. Выполняет арифметическое вычитание
|-
|<center><code>*</code></center>
|<center><code>2*2</code></center>
|'''Умножение'''
|<center><code>/</code></center>
|<center><code>15/3</code></center>
|'''Деление'''
|-
|<center><code>**</code></center>
|<center><code>4**2</code></center>
|'''Возведение в степень'''
|<center><code>%</code></center>
|<center><code>10%5</code></center>
|'''Остаток от деления'''
|-
| colspan="6" | <center>'''Унарные арифметические операции'''</center>
|-
|<center><code>+</code></center>
|<center><code>+5</code></center>
|'''Унарный плюс'''
|<center><code>-</code></center>
|<center><code>-6</code></center>
|'''Унарный минус'''. Делает положительное число отрицательным, а отрицательное — положительным
|-
| colspan="6" | <center>'''Инкремент/декремент'''</center>
|-
|<center><code>++</code></center>
|<center><code>$i = 5, $j=$i++;</code></center>
|'''Постфиксный инкремент'''. Увеличивает значение переменной на единицу после всех прочих операций над переменной. В примере значение в <code>$j</code> будет 5, а в <code>$i</code> значение будет 6, потому что инкремент выполняется после присваивания
|<center><code>++</code></center>
|<center><code>$i = 5, $j=++$i;</code></center>
|'''Префиксный инкремент'''. В отличие от постфиксного инкремента, значение в операнде будет увеличено до всех прочих операций над ним. В данном примере в обеих переменных будет 6
|-
|<center><code>--</code></center>
|<center><code>$i = 5, $j=$i--;</code></center>
|'''Постфиксный декремент'''. Уменьшает значение переменной на единицу после всех прочих операций над переменной. В примере значение в <code>$j</code> будет 5, а в <code>$i</code> значение будет 4, потому что декремент выполняется после присваивания
|<center><code>--</code></center>
|<center><code>$i = 5, $j=--$i;</code></center>
|'''Префиксный декремент'''. В отличие от постфиксного декремента, значение в операнде будет уменьшено до всех прочих операций над ним. В данном примере в обеих переменных будет 4
|}
* В основном арифметические операции направлены на работу с числами, однако операндами могут выступать и строки, причем не обязательно, чтобы они конвертировались в числа. В таких случаях интерпретатор сначала попытается выделить число из символов, начиная с первого. Если выделить число не получается, то результатом конвертации будет 0. Так, строка <code>5gh4</code> будет конвертирована в 5, а <code>g130</code> — в 0.
* Если в операции остаток от деления (<code>%</code>) второй операнд является вещественным числом и имеет дробную часть, то он предварительно преобразуется в целое число путем простого отброса дробной части.
* Отрицательное число <u>нельзя</u> возводить не в целую степень. Интерпретатор не будет выдавать никакой ошибки, но при этом результат всегда будет 0.
* Бинарные арифметические операции выполняются в ''скалярном контексте''. Это означает, что интерпретатор будет ожидать в операндах скалярные переменные. Если в операндах будут массивы, то они будут преобразованы к числу элементов в массиве, а в случае хеш-массива — к числу использованных хеш-записей в нем.
* Инкремент и декремент можно применять к строковым данным. В случае инкремента, если строка состоит только из латинских букв, то результатом будет новая строка, в которой последняя буква будет заменена на следующую по порядку в алфавите, причем строчная буква заменяется строчной, а прописная — прописной. Аналогично происходит, если строка завершается цифрой. Для декремента Perl будет пытаться конвертировать строку в число по обычным правилам, описанным выше.
== Строковые операции ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Строковые операции'''</center>
|-
|<center><code>.</code></center>
|style="width:10%;"|<center><code>"a"."b"</code></center>
|style="width:30%;"|'''Конкатенация строк'''. Объединяет две строки в одну
|<center><code>x</code></center>
|style="width:10%;"|<center><code>"a" x 3</code></center>
|style="width:30%;"|'''Повторитель'''. Повторяет строку в левом операнде N число раз и возвращает из этого строку
|}
* Строковые операции обычно направлены на строковый тип данных, однако можно использовать и числа. В этом случае числа будут преобразованы в строки.
* Оператор конкатенации не вставляет пробелы между строками. Обычно для объединения с пробелами прибегают к функции <code>join</code>.
* Для операции ''повторения'' левый операнд всегда приводится к строковому значению. Правым операндом должно быть целое число, либо строка, которая может быть приведена к целому числу. В случае вещественного числа, дробная часть будет просто отбрасываться.
* Для операции ''повторения'' левым операндом может быть список слов, заключенный в круглые скобки, т.е. эта операция может работать в ''списковом контексте''. В таком случае список будет повторен указанное число раз. Такой прием используется для порождения списка, передаваемого конструктору массива.
* Знак операции повторения следует всегда отделять хотя бы одним пробелом от его операндов, так как в некоторых ситуациях интерпретатор может принять его за часть имени переменной.
* С операцией повторения связана устойчивая идиома, используемая для быстрого заполнения одинаковыми значениями:<source lang="perl">
@arr[1..5] = (1) x 5;
print "@arr\n";
# 1 1 1 1 1
@hash{qw{ apples bananas pears }} = (0) x 3;
print "@{[%hash]}\n";
# apples 0 bananas 0 pears 0
</source>Если в левом операнде операции повторения используется массив, то операция будет выполняться в списковом контексте, в котором она повторит элементы указанное число раз в новом массиве. Если этот массив присвоить срезу массива или хэша (слева от присваивания), то сгенерированные повторением элементы будут присвоены элементам среза. На практике часто используется прием получения хеша из параметров командной строки, переданных сценарию:<source lang="perl">
my %exists;
@exists{@ARGV} = (1) x @ARGV;
# \ \____ В скалярном контексте развернется в число элементов массива @ARGV.
# \___________________ Получается хеш, в котором ключами будут элементы командной строки.
</source>
== Логические операции ==
=== Операции отношения ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Числовые отношения'''</center>
|-
|<center><code>></code></center>
|style="width:10%;"|<center><code>2>1</code></center>
|style="width:30%;"|'''Больше'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>>=</code></center>
|style="width:10%;"|<center><code>3>=1</code></center>
|style="width:30%;"|'''Больше либо равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code><</code></center>
|<center><code>-3<0</code></center>
|'''Меньше'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code><=</code></center>
|<center><code>0<=3</code></center>
|'''Меньше либо равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>==</code></center>
|<center><code>3==3</code></center>
|'''Равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>!=</code></center>
|<center><code>1!=2</code></center>
|'''Не равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code><=></code></center>
|<center><code>15<=>63</code></center>
|'''Один из операндов больше другого'''. Возвращает -1, если правый операнд больше левого; 1 — правый операнд меньше левого; 0 — операнды равны
|
|
|
|-
| colspan="6" | <center>'''Строковые отношения'''</center>
|-
|<center><code>eq</code></center>
|<center><code>"a" eq "a"</code></center>
|'''Строки лексикографически равны'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>ne</code></center>
|<center><code>"a" ne "b"</code></center>
|'''Строки лексикографически не равны'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>lt</code></center>
|<center><code>"a" lt "c"</code></center>
|'''Левая строка лексикографически меньше правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>le</code></center>
|<center><code>"a" le "c"</code></center>
|'''Левая строка лексикографически меньше или равна правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>gt</code></center>
|<center><code>"d" gt "e"</code></center>
|'''Левая строка лексикографически больше правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>ge</code></center>
|<center><code>"d" ge "e"</code></center>
|'''Левая строка лексикографически больше или равна правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>cmp</code></center>
|<center><code>"a" cmp "b"</code></center>
|'''Лексикографически один из операндов не равен другому'''. Возвращает -1, если правый операнд лексикографически больше левого; 1 — правый операнд лексикографически меньше левого; 0 — операнды лексикографически равны
|
|
|
|}
* Обратите внимание, что операции отношения скопированы с командной оболочки Bourne Shell, но там все было наоборот: <code>eq</code>, <code>ne</code>, <code>lt</code>, <code>le</code>, <code>gt</code> и <code>ge</code> применялись к числам, а привычные нам знаки использовались для лексикографического сравнивания. Об этом нужно помнить, когда вы переключаетесь с программирования для командной оболочки на программирование для Perl.
* Лексикографическое сравнивание означает, что сравниваются ASCII кодировки символов. Так символ <code>a</code> лексикографически будет меньше символа <code>b</code>, потому что код последнего (98) больше первого (97). При лексикографическом сравнивании строк учитывается код каждого символа в строке, а также длина строк.
* ИСТИНА для числовых отношений это число 1, а для строковых — строка <code>"1"</code>.
* В общем случае следует быть осторожным при сравнивании вещественных чисел с целыми, так как тут вступает фактор округления чисел. Следует отметить, что вещественные числа вообще нельзя сравнивать на равенство, так как результат практически всегда будет неправильным. В этом случае следует сравнивать разницу двух вещественных чисел с очень малым числом (погрешностью). Можно использовать и другой приём, когда числа преобразуются в строки и сравниваются как строки.
=== Булевы выражения ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Булевы операции'''</center>
|-
|<center><code>&&</code></center>
|style="width:10%;"|<center><code>1 && 1</code></center>
|style="width:30%;"|'''Конъюнкция'''
|<center><code><nowiki>||</nowiki></code></center>
|style="width:10%;"|<center><code><nowiki>0 || 1</nowiki></code></center>
|style="width:30%;"|'''Дизъюнкция'''
|-
|<center><code>!</code></center>
|<center><code>! 0</code></center>
|'''Логическое отрицание'''
|<center><code>xor</code></center>
|<center><code>1 xor 1</code></center>
|'''Исключающее ИЛИ'''
|-
|<center><code>and</code></center>
|<center><code>1 and 1</code></center>
|'''Конъюнкция'''. ''Синоним''
|<center><code>or</code></center>
|<center><code>0 or 1</code></center>
|'''Дизъюнкция'''. ''Синоним''
|-
|<center><code>not</code></center>
|<center><code>not 1</code></center>
|'''Логическое отрицание'''. ''Синоним''
|<center><code>^^</code></center>
|<center><code>1 ^^ 1</code></center>
|'''Исключающее ИЛИ'''<ref>Знак операции появился с версии интерпретатора 5.40.</ref>
|-
|<center><code>//</code></center>
|<center><code>$a // $b</code></center>
|'''Слияние'''
|
|
|
|}
* Операции <code>or</code>, <code>and</code>, <code>not</code> и <code>xor</code> появились в Perl, начиная с версии 5.001. Отличие их от аналогичных операций в виде символов в том, что они имеют меньший приоритет при вычислении в сложных выражениях. Такой пониженный приоритет иногда требуется в выражениях по типу <code>$num != 0 or print "\$num == 0";</code>
* Для булевых операций ИСТИНОЙ признается любое скалярное значение не равное <code>0</code>, <code>"0"</code> и <code>""</code>, в противном случае это ЛОЖЬ. Значение <code>undef</code> также приравнивается ко ЛЖИ.
* Булевы операции конъюнкции и дизъюнкции вычисляются по укороченной схеме. Это означает, например, что если при конъюнкции ЛОЖЬ в некотором операнде встречается раньше, чем закончилось выражение, вычисление прекращается на этом операнде с общим результатом ЛОЖЬ.
* Хотя булевы операции рассчитаны в основном на то, чтобы использовать их с числами, некоторые из них можно использовать для работы со строками. Полезной здесь оказывается дизъюнкция, которая может быть использована для записи укороченного присваивания значений по умолчанию, что показано в следующем примере: <source lang="perl">
# Эта процедура просто возвращает строку, переданную в аргументе, но если он не передается,
# то она назначит ему значение по умолчанию.
sub procedure {
my ($arg) = @_;
$arg ||= "default_value";
return $arg;
}
# Вызов без аргумента
print "Result: " . procedure . "\n";
# Result: default_value
# Вызов с аргументом
print "Result: " . procedure "some_value" . "\n";
# Result: some_value
</source> Также, в случаях, когда неопределенные значения недопустимы, она может использоваться для выбора из альтернативы: <source lang="perl">
$var = undef;
$var = $var || "default_value";
print "$var\n";
# default_value
# Размер цепочки может быть сколько угодно большим. В данном примере мы использовали
# undef для демонстрации, но представьте на их местах переменные. Значение по умолчанию
# выбирается с разным приоритетом (первое не пустое с левого края).
$value = undef || undef || undef || "default_value";
print "$value\n";
</source>
* Операция слияния (<code>//</code>) работает так: если левый операнд определен (''defined''), то вычисляется выражение, записанное в первом операнде и его результат возвращается как результат всей операции, иначе, если левый операнд не определен, но определен второй операнд, то его результат возвращается как результат всей операции. Если не определены оба операнда, то возвращается <code>undef</code> как результат всей операции. Технически операция похожа на тернарную операцию (см. ниже), но нацелена она на проверку условия ''определен'' / ''не определен''. Операция имеет пониженный приоритет, поэтому в сложных выражениях её обычно следует оставлять в скобках. Вот примеры, когда она может использоваться:<source lang="perl">
# Взять значение в кеше или вызвать процедуру по извлечению значения из хранилища.
$data = $cache{ $key } // get_from_storage($key);
# ----------------------------------------------------------
$x = 10;
$y = undef;
$z = 5;
# Это выражение ...
$result = $x + ($y // $z);
# ... является коротким способом записать такое
unless (defined $y) {
$result = $x + $z;
} else {
$result = $x + $y;
}
# ----------------------------------------------------------
$discounted_price = 60;
$base_price = 100;
$tax_rate = undef;
$price = $discounted_price // $base_price;
# Если налоговая ставка не определена, то она равняется нулю.
$final = $price * (1 - ($tax_rate // 0));
# ----------------------------------------------------------
$default_config = 'default';
# Будет присвоено первое определенное значение.
$config_value = $ARGV[0] // $ENV{'PARAM'} // $default_config;
# ----------------------------------------------------------
$default_config = undef;
$config_value = $ARGV[0] // $ENV{'PARAM'} // $default_config;
# Процедура compute_expensive_value будет вызвана только если config_value
# не определена.
$config_value //= compute_expensive_value();
sub compute_expensive_value {
'computed'
}
print "$config_value\n";
</source>
=== Побитовые операции ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Побитовые операции'''</center>
|-
|<center><code><nowiki>&</nowiki></code></center>
|style="width:10%;"|<center><code>3 & 2</code></center>
|style="width:30%;"|'''Побитовое И'''. Выполняет конъюнкцию двух чисел побитово
|<center><code><nowiki>|</nowiki></code></center>
|style="width:10%;"|<center><code><nowiki>3 | 2</nowiki></code></center>
|style="width:30%;"|'''Побитовое ИЛИ'''. Выполняет дизъюнкцию двух чисел побитово
|-
|<center><code>^</code></center>
|<center><code>3 ^ 3</code></center>
|'''Побитовое исключающее ИЛИ'''
|<center><code>~</code></center>
|<center><code>~0</code></center>
|'''Побитовое отрицание'''
|-
|<center><code><<</code></center>
|<center><code>1 << 1</code></center>
|'''Побитовый сдвиг влево'''
|<center><code>>></code></center>
|<center><code>2 >> 1</code></center>
|'''Побитовый сдвиг вправо'''
|}
* Побитовые операции работают только с числами, если хотя бы один операнд является числовым типом.
* До версии 5.20 операции пытались автоматически работать со стоковыми операндами. Если '''хотя бы один''' операнд являлся строкой (которая не может быть сконвертирована в число, потому что записана не только цифрами), то побитово выполняются операции с кодом каждого символа, даже если другой операнд записан только цифрами. Если при этом строки разной длины, то меньшая из них дополняется символами <code>\000</code> до равенства. Но, как позже выяснилось, такое автоматическое поведение приводило к трудноуловимым ошибкам.
* Начиная с Perl 5.20, побитовые операции для числовых и строковых типов данных были строго отделены директивой <code>use feature 'bitwise'</code>, а с версии 5.28 она всегда включается автоматически. Операции <code>&</code>, <code>|</code>, <code>^</code>, <code>~</code> работают только с числовым типом данных, а <code>&.</code>, <code>|.</code>, <code>^.</code>, <code>~.</code> работают со строковым типом данных:<source lang="perl">
use feature "bitwise";
$a = "10";
$b = "12";
printf "string 'a': %vb\n", $a;
printf "number 'a': %06b\n", ($a + 0);
printf "string 'b': %vb\n", $b;
printf "number 'b': %06b\n", ($b + 0);
printf "a & b: %vb\n", ($a & $b);
printf "a &. b: %vb\n", ($a &. $b);
printf "a & b: %vb (numeric)\n", ($a + 0 & $b + 0);
</source><source lang="bash">
string 'a': 110001.110000
number 'a': 001010
string 'b': 110001.110010
number 'b': 001100
a & b: 111000
a &. b: 110001.110000
a & b: 111000 (numeric)
# Пояснения:
# До версии 5.20 интерпретатор будет завершаться с ошибкой, так как операций с точкой
# ещё не существовало. Директива выше гарантирует, что bitwise поддерживается.
# Так как оба операнда могут быть корректно сконвертированы в числа, то мы можем увидеть,
# что операция & работает с операндами как с числами (001010 & 001100 = 001000 или 8, что в
# в ASCII соответствует коду 56, который в двоичной системе 111000), а операция &. работает с
# каждым символом в строке по отдельности, поэтому получается результат 110001.110000.
</source>
* Все вещественные числа преобразуются к целым простым отбрасыванием дробной части:<source lang="perl">
# Выражение ...
$result = 3.5 & 5.9;
# ... и ...
$result = 3 & 5;
# ... работают одинаково.
</source>
* Допустимо использовать любой формат представления чисел: десятичный, шестнадцатеричный и восьмеричный.
* При выполнении поразрядных операций, внутренне операнды переводятся в IV или UV структуру, при этом отрицательные числа дополняются до двух. Разрядность UV / IV зависит от разрядности процессора, при этом сдвиги отрицательных чисел могут зависеть от компилятора, которым был собран интерпретатор Perl. В случае переполнения чисел в операндах, результаты не предсказуемы, поэтому для очень больших чисел вы должны использовать специализированные модули. Чтобы узнать внутреннее представление UV / IV, используйте команду<source lang="perl">
$ perl -V:ivsize
$ perl -V:uvsize
</source>
== Операции присваивания ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Операции присваивания'''</center>
|-
|<center><code>=</code></center>
|style="width:10%;"|<center><code>$i = 2</code></center>
|style="width:30%;"|'''Простое присваивание'''
|<center><code>**=</code></center>
|style="width:10%;"|<center><code>$i **= 2</code></center>
|style="width:30%;"|'''Возведение в степень с присваиванием'''
|-
|<center><code>+=</code></center>
|<center><code>$i += 2</code></center>
|'''Сложение с присваиванием'''
|<center><code>-=</code></center>
|<center><code>$i -= 2</code></center>
|'''Вычитание с присваиванием'''
|-
|<center><code>.=</code></center>
|<center><code>$i .= 2</code></center>
|'''Конкатенация с присваиванием'''
|<center><code>*=</code></center>
|<center><code>$i *= 2</code></center>
|'''Умножение с присваиванием'''
|-
|<center><code>/=</code></center>
|<center><code>$i /= 2</code></center>
|'''Деление с присваиванием'''
|<center><code>%=</code></center>
|<center><code>$i %= 2</code></center>
|'''Остаток от деления с присваиванием'''
|-
|<center><code>x=</code></center>
|<center><code>$i x= 2</code></center>
|'''Повторение с присваиванием'''
|<center><code>&=</code></center>
|<center><code>$i &= 2</code></center>
|'''Поразрядное И с присваиванием'''
|-
|<center><code><nowiki>|=</nowiki></code></center>
|<center><code><nowiki>$i |= 2</nowiki></code></center>
|'''Поразрядное ИЛИ с присваиванием'''
|<center><code>^=</code></center>
|<center><code>$i ^= 2</code></center>
|'''Поразрядное исключающее ИЛИ с присваиванием'''
|-
|<center><code><<=</code></center>
|<center><code>$i <<= 2</code></center>
|'''Поразрядный сдвиг влево с присваиванием'''
|<center><code>>>=</code></center>
|<center><code>$i >>= 2</code></center>
|'''Поразрядный сдвиг вправо с присваиванием'''
|-
|<center><code>&&=</code></center>
|<center><code>$i &&= 2</code></center>
|'''Конъюнкция с присваиванием'''
|<center><code><nowiki>||=</nowiki></code></center>
|<center><code><nowiki>$i ||= 2</nowiki></code></center>
|'''Дизъюнкция с присваиванием'''
|-
|<center><code>^^=</code></center>
|<center><code>$i ^^= 1</code></center>
|'''Исключающее ИЛИ с присваиванием'''<ref>Поддерживается с версии 5.42.</ref>
|<center><code>//=</code></center>
|<center><code>$value //= $default</code></center>
|'''Слияние с присваиванием'''
|}
* Простое присваивание является бинарной операцией, правый операнд которой является выражением, а левый — определяет участок памяти (в форме переменной), в который запишется результат выражения. Операция присваивания возвращает левый операнд как результат выражения. По этой причине следующая запись будет синтаксически правильной<source lang="perl">
($i = $j) = 5;
# Если развернуть эту конструкцию, то получается
$i = $j;
$i = 5; # Так как выражение в скобках вернет $i
</source>
* Как в языке Си, в Perl есть составное присваивание, совмещающее в себе операцию и присваивание. Операции с присваиванием также возвращают левый операнд, как результат выражения<source lang="perl">
$b = 1;
$a = ($b += 3); # Аналогично $a = $b = 4
$a += ($b += 3); # Аналогично $a = $a + $b + 3
(($a += 2) **= 2 ) -= 1; # Аналогично $a = ($a + 2) ** 2 - 1
</source>Обратим внимание, что в большинстве ситуаций в сложных выражениях ставить скобки для операций присваивания обязательно, потому что, как вы узнаете ниже, они парсятся интерпретатором справа налево.
== Списковые операции ==
''Списковая операция'' — это операция над списком значений. Операции, которым передаются списки и кажущиеся функциями, на самом деле являются списковыми операциями, например <code>print</code>. Это связано с тем, что списковые операции разрешают помещать свои аргументы в скобки. Так, следующие вызовы равнозначны
<source lang="perl">
print $a, "hello", $b;
print ($a, "hello", $b);
</source>
Списковые операции ожидают на входе список скаляров в некоторой форме, а на выходе отдают тот же список, но модифицированный некоторым образом, либо новый список. Так, следующие операции являются списковыми:
* Создание и конкатенация массивов<source lang="perl">
@array1 = (1,2,3);
@array2 = (4,5,6);
@array3 = (@array1, @array2);
</source>
* Встроенные операции, связанные с манипуляцией значением(ми) в массиве<source lang="perl">
@array = (1,2,3);
push @array, 4; # (1, 2, 3, 4)
pop @array; # (1, 2, 3); 4 возвращается как результат
shift @array; # (2, 3); 1 возвращается как результат
unshift @array, 5; # (5, 2, 3)
splice @array, 0, 2; # (3); (5, 2) возвращается как результат
</source>
* Трансформация (новый массив возвращается как результат)<source lang="perl">
@array = qw { a b c d e f };
# Применение предиката к каждому элементу в списке
print "$_\n" foreach map { $_ . $counter++ } @array;
#
# Вызов map в модификаторе foreach возвращает новый массив, каждый элемент которого
# печатается print слева от модификатора. В этом примере процедура предиката к каждому
# элементу исходного массива добавляет порядковый номер, в результате чего получается
#
# a0
# b1
# c2
# d3
# e4
# f5
#
# Сформировать новый массив, элементы которого хранятся в обратном порядке
print "$_\n" foreach reverse @array;
# f
# e
# d
# c
# b
# a
# Сортировка
use List::Util; # Подключаем модуль для перемешивания элементов для дальнейшего примера.
@array = List::Util::shuffle(@array); # Перемешиваем элементы в случайном порядке.
print "@{array}\n"; # Вывод будет отличаться при каждом вызове: "b f d a e c"
@array = sort @array; # Снова в алфавитном порядке.
print "@{array}\n"; # "a b c d e f"
</source>
* Фильтрующие операции (возвращают подмножество исходного массива как результат)<source lang="perl">
@array = qw { a 1 5 d 6 f 8 9 h j k l 25 };
@numbers = grep /\d+/, @array; # Достаем из исходного массива только цифры
print "@{numbers}\n"; # "1 5 6 8 9 25"
@letters = grep /[a-z]+/, @array; # Достаем из исходного массива только буквы
print "@{letters}\n"; # "a d f h j k l"
</source>
* Агрегирующие операции (как правило, возвращают все элементы массивов одним значением)<source lang="perl">
@words = qw { apple grapes banana };
$value = join ", ", @words; # объединяет все элементы и вставляет между ними разделитель.
print "${value}\n"; # "apple, grapes, banana"
</source>
* Разворачивающие операции (наоборот, из одного значения получают список)<source lang="perl">
@numbers = 1..5;
print "@{numbers}\n"; # "1 2 3 4 5"
$fruits = "apple, banana, grapes";
@fruits = split ", ", $fruits;
print "@{fruits}\n"; # "apple banana grapes"
</source>
Подробнее о пользовательских списковых операциях будет в главе, посвященной функциям.
=== Списковые операции all и any ===
Начиная с версии 5.42, в ядро интерпретатора были интегрированы две новые операции, помогающие работать с множествами без использования модулей. До этого эти операции приходилось подключать в виде функций из модуля <code>List::Util</code>. Вероятно, добавление этих операций в ядро было вдохновлено языком Python, в котором они существуют в виде операторов.
<source lang="perl">
any { <блок-предиката> } @list;
all { <блок-предиката> } @list;
</source>
Операции <code>all</code> и <code>any</code> мимикрируют под операцию <code>grep</code> и используются, чтобы вернуть логический ответ по предикату. Чтобы операция <code>all</code> вернула ИСТИНУ, необходимо чтобы её предикат вернул ИСТИНУ для каждого элемента списка. Соответственно, для операции <code>any</code> ИСТИНОЙ считается ситуация, когда предикат возвращает ИСТИНУ по меньшей мере для одного элемента списка.
Появление этих операций, хоть и с опозданием, очень кстати, так как различного рода проверки множеств — частая задача на практике. Вот лишь несколько примеров.
<source lang="perl">
use v5.42; # Директива требует интерпретатор не ниже указанной версии.
# Следующие директивы нужны по крайней мере для версии 5.42, так как на тот момент
# эти возможности были еще экспериментальными. В будущих версиях эти
# директивы не понадобятся.
use feature 'keyword_any', 'keyword_all'; # Включает операции
no warnings 'experimental::keyword_any', 'experimental::keyword_all'; # Отключает предупреждения
# Использование my в этом месте обусловлено тем, что директива use v5.42
# автоматически включает директиву strict (будет рассмотрено позже).
my @numbers = (2, 4, 6, 8, 10);
# Через специальную переменную $_ предикат получает очередной элемент списка.
if (all { $_ % 2 == 0 } @numbers) {
print "All numbers are even\n";
}
if (any { $_ > 9 } @numbers) {
print "At least one number is greater than 9\n";
}
</source>
Сравните этот код с программой, которую мы бы написали для версии интерпретатора меньше 5.42:
<source lang="perl">
use List::Util qw{ all any }; # Импортируем функции из модуля.
@numbers = (2, 4, 6, 8, 10);
# ____ Запятую можно опустить, так как у функции есть прототип. Для any она опущена.
# V
if (all { $_ % 2 == 0 }, @numbers) {
print "All numbers are even\n";
}
if (any { $_ > 9 } @numbers) {
print "At least one number is greater than 9\n";
}
</source>
Обратите внимание на то, что в старых версиях интерпретатора функции <code>all</code> и <code>any</code> всегда нужно импортировать из модуля <code>List::Util</code>. Однако не спешите полностью списывать этот модуль, так как в нём есть множество других полезных функций.
== Операции заключения в кавычки ==
Кавычки (одинарные, двойные и обратные) используются в Perl, чтобы задавать строковые литералы. Кроме этого есть еще операции, которые внешне похожи на операции заключения в кавычки, и перечислены в таблице ниже.
{|class="wikitable" style="width:100%;"
|-
! Операция
! Эквивалент
! Описание
! Операция
! Эквивалент
! Описание
|-
| colspan="6" | <center>'''Операции заключения в кавычки'''</center>
|-
|<center><code>q{}</code></center>
|style="width:10%;"|<center><code><nowiki>''</nowiki></code></center>
|style="width:30%;"|'''Строковый литерал'''. Подстановки невозможны<ref>Под этим понимается, что не происходит разрешение (''evaluating'') подстрок, начинающихся с сигилов.</ref>
|<center><code>qq{}</code></center>
|style="width:10%;"|<center><code>""</code></center>
|style="width:30%;"|'''Строковый литерал'''
|-
|<center><code>qx{}</code></center>
|<center><code><nowiki>``</nowiki></code></center>
|'''Команда системы'''
|<center><code>qw{}</code></center>
|<center><code><nowiki>()</nowiki></code></center>
|'''Список слов'''. Подстановки невозможны
|-
|<center><code>m{}</code></center>
|<center><code><nowiki>//</nowiki></code></center>
|'''Поиск по регулярному выражению'''
|<center><code>qr{}</code></center>
|<center><code><nowiki>//</nowiki></code></center>
|'''Шаблон регулярного выражения'''
|-
|<center><code>s{}{}</code></center>
|<center><code>s///</code></center>
|'''Подстановка'''
|<center><code>tr{}{}</code></center>
|<center><code><nowiki>y///</nowiki></code></center>
|'''Транслитерация'''. Подстановки невозможны
|}
* Фигурные скобки в данных операциях представляют собой разделитель. Они могут быть в любой момент заменены на другой символ или любую другую пару скобок, например<source lang="perl">
q{hello}
q/hello/
q!hello!
q<\<hello\>> # Если символы разделителя есть в значении, то они должны экранироваться.
</source>Внутри разделителей разрешается любое число пробелов, а также внутри большинства операций разрешены подстановки, кроме некоторых (указанных в таблице отдельно).
* Операция <code>qw{}</code> позволяет вернуть список слов. Чаще всего она используется, чтобы инициализировать массив.<source lang="perl">
@arr = qw{ one two three };
# Это аналогично
@arr = ("one", "two", "three");
# и
$arr[0] = "one";
$arr[1] = "two";
$arr[2] = "three";
</source>Обратите внимание, что внутри <code>qw{}</code> запятые ставить не нужно: разделителями являются пробелы.
* Об остальных операциях будет рассказано далее по ходу изложения.
=== Операция Here-docs ===
В Perl перекочевала Here-docs операция, придуманная для командной оболочки Bourne Shell, которая позволяет инициализировать переменные многострочными строками, либо передавать их на вход некоторой операции, записывая строки прямо в исходном файле программы. Как и в Bourne Shell она записывается так
<source lang="perl">
$str = <<EOF;
строка 1
строка 2
строка 3
EOF
print <<END;
Hello, World!
END
</source>
Здесь после знака <code><<</code> вводится так называемое стоп-слово. Далее записывается многострочная строка. Интерпретатор будет искать стоп-слово, для того чтобы понять где заканчивается эта строка. Стоп-слово может быть любым строковым литералом. В наших примерах стоп-словами были <code>EOF</code> и <code>END</code>.
За стоп-словом обычно следует ставить символ точки с запятой, так как Here-docs является простым оператором, конец которого находится после ввода стоп-слова. Пропуск точки с запятой является очень частой ошибкой. Тем не менее, если оператор Here-docs является единственным или последним в текущем блоке, точку с запятой можно опускать.
По умолчанию многострочная строка записывается так, как будто она находится в двойных кавычках. Таким образом, в ней будут разрешаться все подстановки и управляющие последовательности. Вы можете явно обозначить, как должен поступать интерпретатор, если будете использовать соответствующие кавычки вокруг стоп-слова.
<source lang="perl">
$var = "Hello";
print <<END;
\t$var, World!
END
# Аналогично предыдущему вызову
print <<"END";
\t$var, World!
END
# С одинарными кавычками переменные перестанут подставляться и
# не будут работать управляющие последовательности
print <<'END';
\t$var, World!
END
</source>
Можно также использовать наклонные кавычки, тогда в Here-docs можно писать процедуры командной оболочки и инициализировать переменные результатом работы этих процедур. Каждая строка в таких процедурах это отдельный ввод команды в оболочку. Следует помнить, что результаты могут зависеть от операционной системы, в которой исполняется Perl.
<source lang="perl">
# Выведет каталоги корневой точки монтирования в *nix системе.
print <<`END`;
ls -l /
END
</source>
Если стоп-слово вводится без кавычек, то нельзя ставить пробелы между <code><<</code> и стоп-словом. Если такое случится, то Perl не распознает такого слова и будет захватывать строки до первой пустой строки в исходном файле.
В одном операторе можно ввести больше одного стоп-слова (когда это удобно), если записать их подряд следующим образом.
<source lang="perl">
print <<"END1".<<'END2';
double quotes
END1
single quotes
END2
</source>
По умолчанию, Here-docs сохраняет все лидирующие пробелы в многострочной строке, а также требует, чтобы стоп-слово всегда находилось в первой колонке. Например,
<source lang="perl">
print <<END;
ONE
TWO
THREE
END
</source>
напечатает
<pre>
ONE
TWO
THREE
</pre>
Такое поведение не всегда удобно, особенно, когда Here-docs вложена в некоторый блок: в этом случае в исходном коде нарушается выравнивание, из-за чего его неудобно читать. Сравните
<source lang="perl">
# Операция размещена в блоке, но мы не можем выровнять отступы как нам хочется, а также
# стоп-слово END должно всегда начинаться с первой колонки.
if (1) {
print <<END;
ONE
TWO
THREE
END
}
</source>
С версии 5.26 для Here-docs была добавлена особая форма (<code><<~</code>), которая вычисляет отступ для многострочной строки не от колонки документа с исходным кодом, а от отступа самого стоп слова. Таким образом, с версии 5.26 тот же фрагмент можно записать с сохранением исходных отступов так:
<source lang="perl">
# С версии 5.26
if (1) {
print <<~END;
ONE
TWO
THREE
END
# ^- отступ для многострочной строки вычисляется от этой колонки.
}
</source>
Операция Here-docs может комбинироваться с другими операциями. Для этого удобно пользоваться мнемоническим приемом, в котором нужно представлять, что очередная строка заменяет собой стоп-слово справа от знака <code><<</code>. Вот несколько примеров:
<source lang="perl">
# Каждая строка подается операции uc, которая переводит символы в верхний регистр.
print uc(<<EOF);
one
two
three
EOF
# Результат:
# ONE
# TWO
# THREE
# Удалит лидирующие пробелы для каждой строки.
print <<'EOF' =~ s/^\s+//mgr;
Line one with leading spaces
Line two with leading spaces
EOF
# Результат:
# Line one with leading spaces
# Line two with leading spaces
# При выводе строк будет приписывать к каждой порядковый номер.
sub numbering {
print ++$counter . ": " . $_ . "\n" for split '\n', $_[0];
}
numbering(<<'EOF');
int main(int argc, char** argv)
{
return 0;
}
EOF
# Результат:
# 1: int main(int argc, char** argv)
# 2: {
# 3: return 0;
# 4: }
# Напечатает между строками промежуточную.
print <<'PART1' . "Middle String\n" . <<'PART2';
This is the first part.
PART1
This is the final part.
PART2
# Результат:
# This is the first part.
# Middle String
# This is the final part.
</source>
== Другие операции ==
=== Диапазон ===
Бинарная операция диапазон <code>..</code> по-разному интерпретируется в скалярном и списковом контекстах.
В списковом контексте операция возвращает список из чисел, начиная с левого операнда и до последнего с шагом 1, если оба операнда являются числами, либо строки, которые будут сгенерированы в лексикографическом порядке. Если операндами являются числа, то левый операнд всегда должен быть меньше правого, иначе операция вернет пустой список. Числа также должны быть всегда целыми (если это не так, то дробная часть будет просто отбрасываться).
Если строка-левый операнд в лексикографическом смысле больше правого, то результат может зависеть от версии интерпретатора <code>perl</code>: в старых версиях по умолчанию просто возвращается левый операнд; в версии 5.32 будет возвращен ряд, начиная с большего операнда и до символа <code>z</code>. Кроме того, нельзя использовать символы из других алфавитов, кроме латинского: для других алфавитов всегда возвращается левый операнд как результат.
<source lang="perl">
(1..5); # 1 2 3 4 5
(-3..5); # -3 -2 -1 0 1 2 3 4 5
("a".."d"); # a b c d
("01".."10"); # 01 02 03 04 05 06 07 08 09 10
("a1".."b2"); # a1 a2 a3 ... a9 b1 b2
</source>
В скалярном контексте диапазон возвращает булево значение и эмулирует поведение операции запятая <code>,</code> из редакторов Sed и AWK (например, конструкция <code>1,3p</code>). Алгоритм поведения может показаться сложным при первом прочтении, тем не менее следует познакомиться с ним:
* Диапазон в скалярном контексте всегда находится в одном из двух состояний, которое может измениться при повторном вычислении. Условно мы назовем их ИСТИНА и ЛОЖЬ.
* Диапазон остается в ЛОЖНОМ состоянии до тех пор, пока ЛОЖНЫМ остается значение левого операнда. Как только он становится ИСТИНОЙ, диапазон переключает состояние в ИСТИНУ и остается в нем, пока правый операнд не станет ИСТИННЫМ. Когда это происходит, диапазон снова переключается в ЛОЖНОЕ состояние.
* В ЛОЖНОМ состоянии этот диапазон возвращает пустую строку (или ЛОЖЬ). В состоянии ИСТИНА при каждом повторном вычислении возвращается порядковый номер, начиная с 1.
* В момент перехода из ИСТИНЫ в ЛОЖЬ диапазон возвращает строку, в которой к последнему порядковому номеру добавляется <code>"E0"</code>, например <code>2E0</code>. В ИСТИННОМ состоянии <code>E0</code> будет отбрасываться.
Вот собственно и весь алгоритм. Добавление <code>"E0"</code> при смене состояния эмулирует поведение именно утилиты AWK. В Sed добавление этой строки происходит только на следующем вычислении. Чтобы эмулировать именно поведение Sed, нужно использовать три точки <code>...</code>.
Диапазоны в скалярном контексте в Perl обычно используются при чтении файлов.
==== Использование диапазона в условном контексте ====
Диапазоны Perl в условном контексте могут использоваться для программирования диапазонов Sed и AWK. Ниже показан небольшой пример с блоком <code>__DATA__</code>, в котором хранятся данные программы.
<source lang="perl">
while (<DATA>) {
if (/START/ .. /END/) {
print;
}
}
__DATA__
Ignore this line
START
Data line 1
Data line 2
END
Ignore this line too
</source>
<pre>
START
Data line 1
Data line 2
END
</pre>
Программа использует специальный дескриптор <code>DATA</code>, по которому читается блок строк, записанный в исходном файле после макроса <code>__DATA__</code>. С помощью диапазона, мы фильтруем всё в этом блоке, кроме строк между строками <code>START</code> и <code>END</code>. Когда под проверку регулярным выражением <code>/START/</code> попадает строка <code>START</code>, диапазон переключается в состояние ИСТИНА, так как совпадение есть, и остается в этом состоянии до тех пор, пока проверка по регулярному выражению <code>/END/</code> возвращает ЛОЖЬ. Соответственно, когда <code>/END/</code> возвращает ИСТИНУ, то диапазон переключается в ЛОЖНОЕ состояние, и вывод строк прекращается.
В предыдущем примере операции <code>..</code> и <code>...</code> работают одинаково. Разницу между ними можно показать на таком примере:
<source lang="perl">
@lines = ( "START END", "data", "END" );
print "Operation ..\n";
foreach (@lines) {
print "Parsing: $_\n" if /START/ .. /END/;
}
print "\nOperation ...\n";
foreach (@lines) {
print "Parsing: $_\n" if /START/ ... /END/;
}
</source>
<pre>
Operation ..
Parsing: START END
Operation ...
Parsing: START END
Parsing: data
Parsing: END
</pre>
Обратите внимание, что при операции <code>..</code> напечаталась только первая строка, а при операции <code>...</code> — все строки. Это произошло потому, что операция <code>..</code> перешла в ложное состояние сразу на первой итерации, потому что оба её операнда были проверены одновременно. Именно наличие строк <code>START</code> и <code>END</code> в одной большой строке сбивает <code>..</code>, но этого не происходит с <code>...</code>, потому что второй операнд проверяется только при следующем обращении к операции.
Очень часто в таком контексте эти операции используются, чтобы читать некоторые текстовые файлы, содержимое которых вам известно. Например, трюк про чтение строк в файле по диапазону:
<source lang="perl">
# Пусть DATA это наш файл. Следующий код читает в этом файле строки,
# начиная с 3 и заканчивая 6.
while (<DATA>) {
if (3 .. 6) {
print;
}
}
__DATA__
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
</source>
<pre>
line 3
line 4
line 5
line 6
</pre>
==== Оператор Yada Yada ====
Начиная с версии 5.12, операцию <code>...</code> можно использовать как заглушку. В сообществе Perl в таком контексте оператор называется Yada Yada<ref>Yada Yada — это сленговое словечко, которое можно перевести на русский примерно как ''«и так далее и тому подобное»''. Оно используется, когда говорящий хочет отбросить несущественные для изложения детали, чтобы перейти сразу к сути. В контексте программирования это может означать, что конкретная реализация в этом месте подразумевается, но для текущего изложения какова она — это не важно. Эта фраза попала в Perl благодаря сериалу «Сайнфилд» 1997 года, в котором в серии «The Yada Yada» персонажи постоянно использовали эту фразу, чтобы замалчивать пикантные или неловкие детали своей жизни:<blockquote>«Мы пошли к нему домой, поужинали, yada yada yada, и я больше не могу ходить в эту церковь».</blockquote></ref>. В языке Python, наиболее близким по смыслу к Yada Yada является оператор <code>pass</code>.
Пример:
<source lang="perl">
use v5.12; # Разрешено использовать только с 5.12
sub concrete_implementation {
my ($arg) = @_;
...
# TODO: Пока еще не придумал, что здесь делать.
}
# ...
# В этом месте мы должны вызвать эту реализацию ...
concrete_implementation(123);
# ...
</source>
<pre>
Unimplemented at ./script.pl line 8.
</pre>
=== Операция запятая ===
Операция запятая <code>,</code> является бинарной и ведет себя по-разному в скалярном и списковом контекстах:
* в списковом контексте она является разделителем для элементов в списке;
* в скалярном контексте она сначала вычисляет левый операнд, потом правый и возвращает результат правого операнда как общий результат.
<source lang="perl">
# Так как левый операнд присваивания это переменная на массив, то выражение исполняется в списковом контексте.
# В этом примере запятая разделяет элементы списка, который передается конструктору массива.
@arr = (1, 2);
# Теперь выражение выполняется в скалярном контексте. Оба операнда для запятой являются простыми числами, но
# как результат операции, будет возвращена 2, которая будет присвоена скаляру.
$scalar = (1, 2);
</source>
У запятой есть синоним в виде <code>=></code>, который мы ранее использовали для построения хеш-массивов в конструкторе. В основном этот знак повторяет запятую, но требует чтобы левый операнд всегда имел строковый тип и корректно в него конвертировался.
Операция является излюбленным инструментом трюков интерпретации. Например, следующая конструкция по порядку вызовет все процедуры, при этом в первой печати мы попутно захватываем результат вызова процедуры <code>b</code>, пользуясь тем, что операция используется в списковом контексте, в котором мы можем пользоваться индексацией массива, а во втором случае, выполняя все в скалярном контексте, мы получаем результат процедуры <code>c</code>:
<source lang="perl">
sub a { print "1\n"; "a" }
sub b { print "2\n"; "b" }
sub c { print "3\n"; "c" }
print STDOUT ( &a, &b, &c )[1], "\n";
print STDOUT scalar ( &a, &b, &c ), "\n";
</source>
<pre>
1
2
3
b
1
2
3
c
</pre>
=== Тернарная операция ===
В Perl есть тернарная условная операция, которая есть во многих языках программирования. Она записывается точно также как в Си:
<source lang="perl">
<операнд 1> ? <операнд 2> : <операнд 3>
</source>
Операция работает так. Если <code><операнд 1></code> является ИСТИНОЙ, то возвращается <code><операнд 2></code> как результат тернарной операции, иначе возвращается <code><операнд 3></code>. Результат тернарной операции можно использовать как в левосторонних (''lvalue''), так и в правосторонних выражениях (''rvalue''), главное чтобы они подставлялись в правильном семантическом контексте.
<source lang="perl">
$var = ($num % 3) ? ($var1 += 1) : ($var1 += 2);
(($a % 3) ? ($a += 2) : $a) -= 2; # Пример с lvalue выражением
</source>
=== Ссылочные операции ===
Большую часть времени мы ссылаемся на данные в памяти компьютера через переменные. Однако язык Perl, подобно Си, разрешает ссылаться на данные в памяти с помощью ''указателей'' или ''ссылок'' (в Perl эти термины равнозначны), которые хранят адрес на ячейку в памяти как значение. Ссылочная передача удобна, когда одни и те же данные разделяют множество процедур и при этом не нужно привязываться к конкретным именам или типам в тексте программы. Возможно процедура сама должна разобраться, что хранится в памяти по переданной ссылке и принять решение самостоятельно.
Чтобы получить адрес переменной, нужно перед ее именем написать обратный слеш <code>\</code> (это аналогично операции получения адреса <code>&</code> в языке Си).
<source lang="perl">
# Ссылка на скаляр
$var = 5;
$ptr = \$var; # Теперь здесь хранится адрес $var
# Ссылка на массив
@arr = (1,2,3);
$aptr = \@arr;
# Ссылка на хеш-массив
%hash = (name => "Larry", surname => "Wall");
$hptr = \%hash;
</source>
Обратите внимание, что адреса хранятся в скалярной переменной. Если мы распечатаем значения, то получим примерно следующее:
<source lang="">
SCALAR(0x800075938)
ARRAY(0x8000759b0)
HASH(0x800075aa0)
</source>
Обратите внимание, что в ссылке хранится информация о типе объекта, на который она ссылается и шестнадцатеричный адрес в памяти компьютера.
Чтобы выполнить обратную операцию, т.е. получить данные по ссылке, ее нужно ''разыменовать''. В отличие от Си, в Perl разыменовывание привязано к типу данных, на который она ссылается. Для этого нужно перед именем ссылки поставить тип, на который будет вестись разыменовывание.
<source lang="perl">
# Разыменовываем ссылку на хеш-массив, чтобы передать его функции keys, которая извлечет из него ключи
@keys = keys(%$hptr);
print $$ptr, "\n"; # Разыменовываем указатель на скаляр
</source>
В предыдущем примере с хеш-массивом мы сначала разыменовали ссылку на хеш-массив, указав символ <code>%</code> в начале, а только потом работали с массивом как обычно, передав его функции <code>keys</code>. Perl позволяет также обращаться к данным массивов непосредственно из ссылки (когда это удобно) при помощи операции разыменовывания массивов <code>-></code>.
<source lang="perl">
print $aptr->[0], $hptr->{name}, "\n";
</source>
Подробнее ссылки мы рассмотрим в отдельной главе (''см.'' [[{{Root book name}}/Ссылки|Ссылки]]).
=== Операции связывания ===
Регулярные выражения являются визитной карточкой Perl, который снабжен различными операциями для проверки по ним. Сюда входят поиск (<code>m//</code>), подстановка (<code>s///</code>) и замена (<code>tr///</code>). По умолчанию они работают с переменной <code>$_</code>.
Кроме них есть операции связывания <code>=~</code> и <code>!~</code>, которые выражают соответственно ''совпадает с шаблоном'' и ''не совпадает с шаблоном''.
Регулярные выражения являются очень обширной темой в Perl, поэтому они будут рассмотрены в отдельной главе (''см.'' [[{{Root book name}}/Работа со строками и регулярные выражения|Работа со строками и регулярные выражения]]).
==== Умное связывание ====
Начиная с 5.10.1 и до 5.37.10 в Perl поддерживалась операция умного связывания, которая умеет сравнивать переменные, хранящие разные типы данных. Данная бинарная операция обозначается двумя тильдами <code>~~</code> и изначально была введена для поддержки оператора <code>given..when</code> (в котором она используется неявно), о котором немного рассказано в следующей главе (см. [[Некоторые сведения о Perl 5/Операторы#Given..when|Операторы#Given..when]]).
Эта операция является особенной, так как её контекст определяется не на этапе компиляции, а во время исполнения программы. Для этого она определяет какой тип данных хранится в её операндах и, в зависимости от этих типов, выбирает механизм сравнивания, причем фактические типы в операндах не обязательно должны совпадать, что и делает её «умной». Если в понимании выбранного механизма операнды равны, она возвращает 1, иначе пустую строку <code>""</code>.
В Perl 5.37.10 данная операция была отмечена как неудачный эксперимент и окончательно будет вырезана в 5.42. Здесь мы о ней упоминаем, чтобы предостеречь не использовать её, хотя следует отметить сколько релизов ей удалось пережить.
=== Именованные унарные операции ===
В Perl есть большое число встроенных функций с одним аргументом, которые с точки зрения синтаксического анализатора являются ''унарными именованными операциями''<ref>Слово ''именованный'' подчеркивает тот факт, что у операции есть имя в виде обозначающего слова, при этом они не требуют скобок вокруг аргумента, копируя операции с одним символом.</ref>. Такие операции подобны функциям, но не требуют скобок вокруг параметра, как того требуют простые функции. О том, является ли функция такой операцией, можно узнать из документации. К таким операциям относятся например <code>do</code>, <code>eval</code>, <code>return</code>, <code>goto</code>, <code>sin</code>, <code>sqrt</code> и другие, а также все операции проверок файлов типа <code>-e</code> (файл существует), <code>-w</code> (в файл можно писать) и другие.
Ключевая особенность именованных унарных операций в Perl заключается в их приоритете: они имеют более высокий приоритет, чем большинство бинарных операций, но ниже, чем скобки и операция стрелки (<code>-></code>).
По ходу изложения мы затронем многие из этих операций.
=== Операции ввода/вывода ===
Это операции, которые направлены на вывод результатов в файлы или ввод данных в программу из них. Так, унарную именованную операцию <code>print</code> можно рассматривать как операцию вывода.
Чтобы обеспечить ввод данных в программу из файлов, нужно сначала их открыть и получить специальный программный объект, называемый ''дескриптором файла''. Дескриптор файла может быть получен через операцию в виде угловых скобок <code><дескриптор_файла></code>:
<source lang="perl">
open(DFILE, "net.cfg"); # Открываем файл. Идентификатор дескриптора DFILE может быть произвольным
@content = <DFILE>; # Читаем файл в массив
</source>
Если бы мы открыли файл на запись, то мы можем перенаправить запись в него так
<source lang="perl">
print MYFILE "Hello";
</source>
Тема ввода/вывода является очень обширной, поэтому она будет рассмотрена в отдельной главе (''см.'' [[{{Root book name}}/Ввод и вывод|Ввод и вывод]]).
== Выражения ==
Понимание того, как интерпретатор Perl парсит выражения, поможет вам лучше понять как они должны составляться. ''Выражение'' — это несколько операндов, объединенных одной и более операциями. Операнд в свою очередь также может быть выражением, т.е. одно общее выражение это конгломерат подвыражений.
Синтаксический анализатор Perl, во время разбора выражения, пытается выделить в нем элементарные члены — ''термы''<ref>Если делать сравнение с естественным языком, то терм является тем же самым, что и ''слово'' в предложении.</ref>, а потом соединить их знаками операций, причем он выстраивает операции в некотором порядке, учитывая приоритет.
В Perl термами являются литералы, переменные, выражения в скобках, закавыченная строка символов, а также функции с параметрами в скобках. Только терм может быть операндом. Отметим, что в Perl отсутствуют истинные функции: по существу они являются списковыми, унарными именованными операциями, ведущими себя как функции. Вызывая функцию, мы выполняем списковую или унарную операцию, которая возвращает некоторый результат.
<source lang="perl">
# Следующее выражение демонстрирует списковую операцию. В ней сначала
# вычисляется как терм каждый элемент списка, а затем каждый элемент выводится
# на печать списковой операции.
print 2 + 2 * 25 / 4, ' ', 16; # Напечатает '14.5 16'
# Следующее выражение дает аналогичный результат. Избыточные скобки
# порождают массив, передаваемый операции.
print (2 + 2 * 25 / 4, ' ', 16); # Напечатает '14.5 16'
# Теперь попробуем добавить конкатенацию:
print (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '14.5 16'
# Обратите внимание, что результат конкатенации потерялся (нет символа '$'
# в выводе). Это произошло потому, что левый операнд конкатенации, как терм
# по приоритету вычисляется первым, т.е. print выводит результат своего терма
# в аргументе, а не результат конкатенации.
# Допустимо
print print (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '14.5 161$'
# Появление единицы объясняется тем, что внутренний print вернул код 1, который
# был преобразован в строку и был объединен конкатенацией
# c '$'. Так как между внутренним и внешним print нет переноса
# строки, получилась такая склеенная строка.
</source>
При синтаксическом разборе выражений и операторов, как термы рассматриваются конструкции <code>do{}</code> и <code>eval{}</code>, вызовы подпрограмм и методов объектов, анонимные конструкторы массивов скаляров и хешей, а также все операции ввода/вывода.
Еще один немаловажный термин это ''контекст операции''. Операции и термы вычисляются в некотором контексте, от которого зависит поведение операции и возвращаемое ей значение. Существует два основных контекста: ''скалярный'' и ''списковый''. В скалярном контексте интерпретатор пытается вывести из терма скаляр, а в списковом контексте — список литералов <code>qw{}</code>. Контекст определяет обычно тип данных левого операнда. Так, если он является скаляром, то операция выполняется в скалярном контексте; если массив скаляров — списковом контексте. Некоторые операции способны распознавать в каком контексте они исполняются и возвращать свой результат в зависимости от него (универсальные операции).
<source lang="perl">
# В списковой операции print перед списком можно указать выходной дескриптор:
print STDOUT (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '16$'
# Потеря 14.5 Объясняется тем, что левый операнд конкатенации
# находится в скалярном контексте, а в нем операция запятая
# возвращает последний операнд как результат.
# Уберем скобки:
print STDOUT 2 + 2 * 25 / 4, ' ', 16 . '$'; # Напечатает '14.5 16$'
# Теперь каждый элемент списка после вычисления
# передается списковой операции, каждый в скалярном контексте.
</source>
Так как в Perl типизация динамическая<ref>Другими словами, все операции в Perl изначально перегружены.</ref>, понятие контекста операции является аналогом операции ''приведения типов данных'', которая есть в типизированных языках программирования. В большинстве ситуаций Perl знает лучше, в каком контексте вызывать операцию, но иногда приходится ему помогать, используя синтаксические конструкции и специальные функции. Умение предсказывать, в каком контексте выполнится операция в выражении, позволяет программисту Perl придумывать подчас очень запутанные (но с другой стороны короткие) конструкции, которые не могут себе позволить другие языки программирования из-за типизации. Мы рассмотрим некоторые случаи ниже.
<source lang="perl">
# В простом случае левый операнд задает контекст операции.
@arr = ("apple", "pear", "grapes", "banana");
# Левый операнд скаляр, а значит присваивание работает в скалярном контексте.
# В скалярном контексте массивы в правом операнде приводятся к их размеру.
$scalar = @arr;
print "$scalar\n";
# Левый операнд список скаляров, а значит присваивание работает в списковом контексте.
# В списковом контексте присваивание будет копировать элементы из массива в правом операнде
# поэлементно в список в левом операнде. При этом список слева не должен превышать размера массива.
( $element1, $element2, $element3 ) = @arr;
print $element1
. " $element2"
. " $element3\n";
# Если слева будет переменная на массив, операция также будет в списковом контексте,
# и правый массив переопределит значение переменной.
@arr1 = (1..4);
@arr1 = @arr;
print "@arr1\n";
#-------------------------------------------------------------------------------------------------------
# Операция print всегда работает в списковом контексте и все элементы списка пытается интерпретировать
# как строки.
# В стандартной библиотеке Perl есть функция localtime, которая в списковом контексте возвращает
# список из 9 элементов, кодирующих текущую дату.
print localtime; print "\n";
# Выведет примерно такое: 3219121301251120
# Однако, localtime умеет работать в скалярном контексте, в котором выводит дату в формате текущей локали,
# но этот контекст не может использоваться по умолчанию, так как компилятор только знает о том, что
# print умеет работать в списковом контексте.
#
# Этот тот случай, когда мы можем подсказать компилятору выполнить localtime в скалярном контексте,
# чтобы напечатать дату в читаемой форме. Для этого нужно воспользоваться функцией scalar, которая
# принуждает интерпретировать выражение в своем аргументе исключительно в скалярном контексте.
print scalar localtime; print "\n";
# В локали LANG_EN будет печататься в формате "Mon Jan 13 12:32:17 2025".
# Можно поступить проще и привести компилятор к скалярному контексту через другую операцию, которая
# этот контекст использует. Например, операция конкатенации строк всегда работает в скалярном контексте.
# Если компилятор увидит выражение, использующее скалярный контекст, он будет использоваться для всех
# операндов операции. Таким образом, такого же результата мы добиваемся, если напишем так:
print localtime . "\n";
# "Mon Jan 13 12:32:17 2025"
#-------------------------------------------------------------------------------------------------------
# Рассмотрим более сложный пример.
# Пусть дана такая строка:
$word = "111example222";
# Вопрос: как посчитать в ней количество символов цифр и букв и совместить это с печатью в одном компактном выражении?
# Для ответа на вопрос "сколько символов данного класса?" здесь следует использовать регулярные выражения.
# Так как о регулярных выражениях мы будем говорить много позже, возьмите на веру, что регулярное выражение для
# поиска цифр выглядит так '/\d/g', а букв так '/[^\d\s]/g'.
#
# Примечание: '/[^\d\s]/g' не учитывает Unicode символы.
#
# Проблема кроется в том, что регулярные выражения умеют работать и в скалярном, и в списковом контекстах.
# Конкретно нам нужен списковый контекст, в котором операция возвращает массив совпадений по шаблону, который
# мы могли бы преобразовать в размер, тем самым ответив на вопрос "сколько?". Но как нам сказать, чтобы операция
# выполнялась в списковом контексте, а не скалярном, ведь специальной функции типа scalar для этого нет?
#
# Единственный способ сделать это, привести компилятор к этому контексту через другую операцию.
# Существует два распространенных приёма провоцировать списковый контекст:
# * Можно использовать операцию присваивания, в которой левый операнд это пустой массив.
# * Можно использовать операцию разыменовывания ссылки, которая будет работать в контексте типа
# разыменовывания.
# Ниже мы в одном выражении используем оба приема для демонстрационных целей
print "Number of letters: "
. ( () = $word =~ /[a-zA-Z]/g ) . "\n"
. "Number of digits: "
. ( @{ [ $word =~ /\d/g ] } ) . "\n"
;
# Number of letters: 7
# Number of digits: 6
</source>
Не расстраивайтесь, если вы ничего из предыдущих примеров не поняли, так как мы сильно забегаем в них вперед. Эти примеры призваны показать, как сильно выражения завязаны на контекст операции.
Скалярный контекст также можно разделить по типу хранимых данных на ''числовой'', ''строковый'' и ''безразличный''. Perl неспособен заранее распознать этот контекст, поэтому он просто подключает механизм неявного приведения данных, когда скаляры в операндах хранят разные типы.
Еще один специальный скалярный контекст — ''булевый''. Так как в Perl нет булева <code>true</code> или <code>false</code>, Perl анализирует строки и числа в булевом контексте, как это было описано выше: <code>0</code>, <code>"0"</code>, <code>"00"</code>, <code>"0.0"</code> и <code>""</code> это условно ЛОЖЬ, а все остальное ИСТИНА.
Еще одним контекстом является void-контекст, который используется, когда в выражении нет побочных эффектов. Так, вы можете спокойно писать в Perl такие бессмысленные конструкции (они выполняются в void-контексте):
<source lang="perl">
(1,2,3);
$n;
"Hello";
</source>
Этот контекст можно обнаружить, если интерпретатор Perl запущен в режиме вывода предупреждающих сообщений.
Еще один контекст это ''подстановочный контекст'', в котором вычисляются операции заключения в кавычки (кроме одинарных кавычек). В этом контексте подставляются переменные и интерпретируются управляющие последовательности.
Ниже для справки представлены приоритеты операций.
{|class="wikitable" style="width:100%;"
|-
! Приоритет
! Операция
! Сочетаемость
|-
|style="width:10%;"|1
|Вычисление термов и левосторонних списковых операций
|style="width:20%;"|Слева направо
|-
|2
|<code><nowiki>-></nowiki></code>
|Слева направо
|-
|3
|<code><nowiki>++</nowiki></code> <code><nowiki>--</nowiki></code>
|Не сочетаются
|-
|4
|<code><nowiki>**</nowiki></code>
|Справа налево
|-
|5
|<code><nowiki>!</nowiki></code> <code><nowiki>~</nowiki></code> <code><nowiki>\</nowiki></code> унарный <code><nowiki>+</nowiki></code> унарный <code><nowiki>-</nowiki></code>
|Справа налево
|-
|6
|<code><nowiki>=~</nowiki></code> <code><nowiki>!=</nowiki></code>
|Слева направо
|-
|7
|<code><nowiki>*</nowiki></code> <code><nowiki>/</nowiki></code> <code><nowiki>%</nowiki></code> <code><nowiki>x</nowiki></code>
|Слева направо
|-
|8
|<code><nowiki>+</nowiki></code> <code><nowiki>-</nowiki></code> <code><nowiki>.</nowiki></code>
|Слева направо
|-
|9
|<code><nowiki><<</nowiki></code> <code><nowiki>>></nowiki></code>
|Слева направо
|-
|10
|Именованные унарные операции
|Не сочетаются
|-
|11
|<code><nowiki><</nowiki></code> <code><nowiki>></nowiki></code> <code><nowiki><=</nowiki></code> <code><nowiki>>=</nowiki></code> <code><nowiki>lt</nowiki></code> <code><nowiki>gt</nowiki></code> <code><nowiki>le</nowiki></code> <code><nowiki>ge</nowiki></code>
|Не сочетаются
|-
|12
|<code><nowiki>==</nowiki></code> <code><nowiki>!=</nowiki></code> <code><nowiki><=></nowiki></code> <code><nowiki>eq</nowiki></code> <code><nowiki>ne</nowiki></code> <code><nowiki>cmp</nowiki></code>
|Не сочетаются
|-
|13
|<code><nowiki>&</nowiki></code>
|Слева направо
|-
|14
|<code><nowiki>|</nowiki></code> <code><nowiki>^</nowiki></code>
|Слева направо
|-
|15
|<code><nowiki>&&</nowiki></code>
|Слева направо
|-
|16
|<code><nowiki>||</nowiki></code>
|Слева направо
|-
|17
|<code><nowiki>..</nowiki></code> <code><nowiki>...</nowiki></code>
|Не сочетаются
|-
|18
|<code><nowiki>?:</nowiki></code>
|Справа налево
|-
|19
|<code><nowiki>=</nowiki></code> <code><nowiki>**=</nowiki></code> <code><nowiki>+=</nowiki></code> <code><nowiki>-=</nowiki></code> <code><nowiki>.=</nowiki></code> <code><nowiki>*=</nowiki></code> <code><nowiki>/=</nowiki></code> <code><nowiki>%=</nowiki></code> <code><nowiki>x=</nowiki></code> <code><nowiki>&=</nowiki></code> <code><nowiki>|=</nowiki></code> <code><nowiki>^=</nowiki></code> <code><nowiki><<=</nowiki></code> <code><nowiki>>>=</nowiki></code> <code><nowiki>&&=</nowiki></code> <code><nowiki>||=</nowiki></code>
|Справа налево
|-
|20
|<code><nowiki>,</nowiki></code> <code><nowiki>=></nowiki></code>
|Слева направо
|-
|21
|Правосторонние списковые операции
|Не сочетаются
|-
|22
|<code><nowiki>not</nowiki></code>
|Справа налево
|-
|23
|<code><nowiki>and</nowiki></code>
|Слева направо
|-
|24
|<code><nowiki>or</nowiki></code> <code><nowiki>xor</nowiki></code>
|Слева направо
|}
* В данной таблице чем выше приоритет операции и чем левее она стоит (в большинстве случаев), тем раньше она выполняется.
* Приоритет списковой операции зависит от ее места в выражении и может изменяться от наивысшего к наименьшему. Все операции в выражении, стоящие слева от списковой, имеют наивысший приоритет по отношению к ней (смотрите 21 приоритет).
* Свойство сочетаемости означает, что операции одного приоритета могут быть в одном выражении, причем порядок их разрешения может быть слева направо или справа налево.
* Скобки позволяют изменить порядок вычисления, определяемому в обычных условиях приоритетом и сочетаемостью. Скобки всегда наделяют выражение в них наивысшим приоритетом.
== Примечания ==
{{примечания}}
3jirpp1hhqwrf4jzjev62ucjdp6ht88
270322
270321
2026-10-09T13:12:13Z
ScriptMaster
15708
/* Оператор Yada Yada */
270322
wikitext
text/x-wiki
{{Навигация учебника}}
''Операция'' — это некоторые действия над операндами, результатом которых является новое значение. В Perl есть десятки операций, большинство из которых мы рассмотрим в этой главе, а другие в последующих. Операции можно делить по типу выполняемых ими действий (например, арифметические, логические и т.д.), по объекту, на который они воздействуют (строковые, списковые, файловые), а иной раз сложно отнести их к какой-то категории.
Большинство операций работает с двумя операндами, которые записываются по обе стороны от знака операции (''бинарная операция''). Например в операции сложения операндами выступают слагаемые. Для других операций может требоваться один операнд (''унарная операция'') или три (''тернарная операция''). В некоторых операциях какие-то операнды можно опускать.
Серия операций, записанная единым куском образует ''выражение''. Любое выражение интерпретируется слева направо, при этом порядок исполнения операций внутри выражения зависит от приоритета операций. Приоритеты операций в выражении можно менять через круглые скобки, которые дают более высокий приоритет.
== Арифметические операции ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Арифметические операции'''</center>
|-
|<center><code>+</code></center>
|style="width:10%;"|<center><code>6.35+8.31</code></center>
|style="width:30%;"|'''Сложение'''. Выполняет арифметическое сложение
|<center><code>-</code></center>
|style="width:10%;"|<center><code>9.15-5</code></center>
|style="width:30%;"|'''Вычитание'''. Выполняет арифметическое вычитание
|-
|<center><code>*</code></center>
|<center><code>2*2</code></center>
|'''Умножение'''
|<center><code>/</code></center>
|<center><code>15/3</code></center>
|'''Деление'''
|-
|<center><code>**</code></center>
|<center><code>4**2</code></center>
|'''Возведение в степень'''
|<center><code>%</code></center>
|<center><code>10%5</code></center>
|'''Остаток от деления'''
|-
| colspan="6" | <center>'''Унарные арифметические операции'''</center>
|-
|<center><code>+</code></center>
|<center><code>+5</code></center>
|'''Унарный плюс'''
|<center><code>-</code></center>
|<center><code>-6</code></center>
|'''Унарный минус'''. Делает положительное число отрицательным, а отрицательное — положительным
|-
| colspan="6" | <center>'''Инкремент/декремент'''</center>
|-
|<center><code>++</code></center>
|<center><code>$i = 5, $j=$i++;</code></center>
|'''Постфиксный инкремент'''. Увеличивает значение переменной на единицу после всех прочих операций над переменной. В примере значение в <code>$j</code> будет 5, а в <code>$i</code> значение будет 6, потому что инкремент выполняется после присваивания
|<center><code>++</code></center>
|<center><code>$i = 5, $j=++$i;</code></center>
|'''Префиксный инкремент'''. В отличие от постфиксного инкремента, значение в операнде будет увеличено до всех прочих операций над ним. В данном примере в обеих переменных будет 6
|-
|<center><code>--</code></center>
|<center><code>$i = 5, $j=$i--;</code></center>
|'''Постфиксный декремент'''. Уменьшает значение переменной на единицу после всех прочих операций над переменной. В примере значение в <code>$j</code> будет 5, а в <code>$i</code> значение будет 4, потому что декремент выполняется после присваивания
|<center><code>--</code></center>
|<center><code>$i = 5, $j=--$i;</code></center>
|'''Префиксный декремент'''. В отличие от постфиксного декремента, значение в операнде будет уменьшено до всех прочих операций над ним. В данном примере в обеих переменных будет 4
|}
* В основном арифметические операции направлены на работу с числами, однако операндами могут выступать и строки, причем не обязательно, чтобы они конвертировались в числа. В таких случаях интерпретатор сначала попытается выделить число из символов, начиная с первого. Если выделить число не получается, то результатом конвертации будет 0. Так, строка <code>5gh4</code> будет конвертирована в 5, а <code>g130</code> — в 0.
* Если в операции остаток от деления (<code>%</code>) второй операнд является вещественным числом и имеет дробную часть, то он предварительно преобразуется в целое число путем простого отброса дробной части.
* Отрицательное число <u>нельзя</u> возводить не в целую степень. Интерпретатор не будет выдавать никакой ошибки, но при этом результат всегда будет 0.
* Бинарные арифметические операции выполняются в ''скалярном контексте''. Это означает, что интерпретатор будет ожидать в операндах скалярные переменные. Если в операндах будут массивы, то они будут преобразованы к числу элементов в массиве, а в случае хеш-массива — к числу использованных хеш-записей в нем.
* Инкремент и декремент можно применять к строковым данным. В случае инкремента, если строка состоит только из латинских букв, то результатом будет новая строка, в которой последняя буква будет заменена на следующую по порядку в алфавите, причем строчная буква заменяется строчной, а прописная — прописной. Аналогично происходит, если строка завершается цифрой. Для декремента Perl будет пытаться конвертировать строку в число по обычным правилам, описанным выше.
== Строковые операции ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Строковые операции'''</center>
|-
|<center><code>.</code></center>
|style="width:10%;"|<center><code>"a"."b"</code></center>
|style="width:30%;"|'''Конкатенация строк'''. Объединяет две строки в одну
|<center><code>x</code></center>
|style="width:10%;"|<center><code>"a" x 3</code></center>
|style="width:30%;"|'''Повторитель'''. Повторяет строку в левом операнде N число раз и возвращает из этого строку
|}
* Строковые операции обычно направлены на строковый тип данных, однако можно использовать и числа. В этом случае числа будут преобразованы в строки.
* Оператор конкатенации не вставляет пробелы между строками. Обычно для объединения с пробелами прибегают к функции <code>join</code>.
* Для операции ''повторения'' левый операнд всегда приводится к строковому значению. Правым операндом должно быть целое число, либо строка, которая может быть приведена к целому числу. В случае вещественного числа, дробная часть будет просто отбрасываться.
* Для операции ''повторения'' левым операндом может быть список слов, заключенный в круглые скобки, т.е. эта операция может работать в ''списковом контексте''. В таком случае список будет повторен указанное число раз. Такой прием используется для порождения списка, передаваемого конструктору массива.
* Знак операции повторения следует всегда отделять хотя бы одним пробелом от его операндов, так как в некоторых ситуациях интерпретатор может принять его за часть имени переменной.
* С операцией повторения связана устойчивая идиома, используемая для быстрого заполнения одинаковыми значениями:<source lang="perl">
@arr[1..5] = (1) x 5;
print "@arr\n";
# 1 1 1 1 1
@hash{qw{ apples bananas pears }} = (0) x 3;
print "@{[%hash]}\n";
# apples 0 bananas 0 pears 0
</source>Если в левом операнде операции повторения используется массив, то операция будет выполняться в списковом контексте, в котором она повторит элементы указанное число раз в новом массиве. Если этот массив присвоить срезу массива или хэша (слева от присваивания), то сгенерированные повторением элементы будут присвоены элементам среза. На практике часто используется прием получения хеша из параметров командной строки, переданных сценарию:<source lang="perl">
my %exists;
@exists{@ARGV} = (1) x @ARGV;
# \ \____ В скалярном контексте развернется в число элементов массива @ARGV.
# \___________________ Получается хеш, в котором ключами будут элементы командной строки.
</source>
== Логические операции ==
=== Операции отношения ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Числовые отношения'''</center>
|-
|<center><code>></code></center>
|style="width:10%;"|<center><code>2>1</code></center>
|style="width:30%;"|'''Больше'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>>=</code></center>
|style="width:10%;"|<center><code>3>=1</code></center>
|style="width:30%;"|'''Больше либо равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code><</code></center>
|<center><code>-3<0</code></center>
|'''Меньше'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code><=</code></center>
|<center><code>0<=3</code></center>
|'''Меньше либо равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>==</code></center>
|<center><code>3==3</code></center>
|'''Равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>!=</code></center>
|<center><code>1!=2</code></center>
|'''Не равно'''. Возвращает 1, если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code><=></code></center>
|<center><code>15<=>63</code></center>
|'''Один из операндов больше другого'''. Возвращает -1, если правый операнд больше левого; 1 — правый операнд меньше левого; 0 — операнды равны
|
|
|
|-
| colspan="6" | <center>'''Строковые отношения'''</center>
|-
|<center><code>eq</code></center>
|<center><code>"a" eq "a"</code></center>
|'''Строки лексикографически равны'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>ne</code></center>
|<center><code>"a" ne "b"</code></center>
|'''Строки лексикографически не равны'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>lt</code></center>
|<center><code>"a" lt "c"</code></center>
|'''Левая строка лексикографически меньше правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>le</code></center>
|<center><code>"a" le "c"</code></center>
|'''Левая строка лексикографически меньше или равна правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>gt</code></center>
|<center><code>"d" gt "e"</code></center>
|'''Левая строка лексикографически больше правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|<center><code>ge</code></center>
|<center><code>"d" ge "e"</code></center>
|'''Левая строка лексикографически больше или равна правой'''. Возвращает "1", если ИСТИНА и <code>""</code>, если ЛОЖЬ
|-
|<center><code>cmp</code></center>
|<center><code>"a" cmp "b"</code></center>
|'''Лексикографически один из операндов не равен другому'''. Возвращает -1, если правый операнд лексикографически больше левого; 1 — правый операнд лексикографически меньше левого; 0 — операнды лексикографически равны
|
|
|
|}
* Обратите внимание, что операции отношения скопированы с командной оболочки Bourne Shell, но там все было наоборот: <code>eq</code>, <code>ne</code>, <code>lt</code>, <code>le</code>, <code>gt</code> и <code>ge</code> применялись к числам, а привычные нам знаки использовались для лексикографического сравнивания. Об этом нужно помнить, когда вы переключаетесь с программирования для командной оболочки на программирование для Perl.
* Лексикографическое сравнивание означает, что сравниваются ASCII кодировки символов. Так символ <code>a</code> лексикографически будет меньше символа <code>b</code>, потому что код последнего (98) больше первого (97). При лексикографическом сравнивании строк учитывается код каждого символа в строке, а также длина строк.
* ИСТИНА для числовых отношений это число 1, а для строковых — строка <code>"1"</code>.
* В общем случае следует быть осторожным при сравнивании вещественных чисел с целыми, так как тут вступает фактор округления чисел. Следует отметить, что вещественные числа вообще нельзя сравнивать на равенство, так как результат практически всегда будет неправильным. В этом случае следует сравнивать разницу двух вещественных чисел с очень малым числом (погрешностью). Можно использовать и другой приём, когда числа преобразуются в строки и сравниваются как строки.
=== Булевы выражения ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Булевы операции'''</center>
|-
|<center><code>&&</code></center>
|style="width:10%;"|<center><code>1 && 1</code></center>
|style="width:30%;"|'''Конъюнкция'''
|<center><code><nowiki>||</nowiki></code></center>
|style="width:10%;"|<center><code><nowiki>0 || 1</nowiki></code></center>
|style="width:30%;"|'''Дизъюнкция'''
|-
|<center><code>!</code></center>
|<center><code>! 0</code></center>
|'''Логическое отрицание'''
|<center><code>xor</code></center>
|<center><code>1 xor 1</code></center>
|'''Исключающее ИЛИ'''
|-
|<center><code>and</code></center>
|<center><code>1 and 1</code></center>
|'''Конъюнкция'''. ''Синоним''
|<center><code>or</code></center>
|<center><code>0 or 1</code></center>
|'''Дизъюнкция'''. ''Синоним''
|-
|<center><code>not</code></center>
|<center><code>not 1</code></center>
|'''Логическое отрицание'''. ''Синоним''
|<center><code>^^</code></center>
|<center><code>1 ^^ 1</code></center>
|'''Исключающее ИЛИ'''<ref>Знак операции появился с версии интерпретатора 5.40.</ref>
|-
|<center><code>//</code></center>
|<center><code>$a // $b</code></center>
|'''Слияние'''
|
|
|
|}
* Операции <code>or</code>, <code>and</code>, <code>not</code> и <code>xor</code> появились в Perl, начиная с версии 5.001. Отличие их от аналогичных операций в виде символов в том, что они имеют меньший приоритет при вычислении в сложных выражениях. Такой пониженный приоритет иногда требуется в выражениях по типу <code>$num != 0 or print "\$num == 0";</code>
* Для булевых операций ИСТИНОЙ признается любое скалярное значение не равное <code>0</code>, <code>"0"</code> и <code>""</code>, в противном случае это ЛОЖЬ. Значение <code>undef</code> также приравнивается ко ЛЖИ.
* Булевы операции конъюнкции и дизъюнкции вычисляются по укороченной схеме. Это означает, например, что если при конъюнкции ЛОЖЬ в некотором операнде встречается раньше, чем закончилось выражение, вычисление прекращается на этом операнде с общим результатом ЛОЖЬ.
* Хотя булевы операции рассчитаны в основном на то, чтобы использовать их с числами, некоторые из них можно использовать для работы со строками. Полезной здесь оказывается дизъюнкция, которая может быть использована для записи укороченного присваивания значений по умолчанию, что показано в следующем примере: <source lang="perl">
# Эта процедура просто возвращает строку, переданную в аргументе, но если он не передается,
# то она назначит ему значение по умолчанию.
sub procedure {
my ($arg) = @_;
$arg ||= "default_value";
return $arg;
}
# Вызов без аргумента
print "Result: " . procedure . "\n";
# Result: default_value
# Вызов с аргументом
print "Result: " . procedure "some_value" . "\n";
# Result: some_value
</source> Также, в случаях, когда неопределенные значения недопустимы, она может использоваться для выбора из альтернативы: <source lang="perl">
$var = undef;
$var = $var || "default_value";
print "$var\n";
# default_value
# Размер цепочки может быть сколько угодно большим. В данном примере мы использовали
# undef для демонстрации, но представьте на их местах переменные. Значение по умолчанию
# выбирается с разным приоритетом (первое не пустое с левого края).
$value = undef || undef || undef || "default_value";
print "$value\n";
</source>
* Операция слияния (<code>//</code>) работает так: если левый операнд определен (''defined''), то вычисляется выражение, записанное в первом операнде и его результат возвращается как результат всей операции, иначе, если левый операнд не определен, но определен второй операнд, то его результат возвращается как результат всей операции. Если не определены оба операнда, то возвращается <code>undef</code> как результат всей операции. Технически операция похожа на тернарную операцию (см. ниже), но нацелена она на проверку условия ''определен'' / ''не определен''. Операция имеет пониженный приоритет, поэтому в сложных выражениях её обычно следует оставлять в скобках. Вот примеры, когда она может использоваться:<source lang="perl">
# Взять значение в кеше или вызвать процедуру по извлечению значения из хранилища.
$data = $cache{ $key } // get_from_storage($key);
# ----------------------------------------------------------
$x = 10;
$y = undef;
$z = 5;
# Это выражение ...
$result = $x + ($y // $z);
# ... является коротким способом записать такое
unless (defined $y) {
$result = $x + $z;
} else {
$result = $x + $y;
}
# ----------------------------------------------------------
$discounted_price = 60;
$base_price = 100;
$tax_rate = undef;
$price = $discounted_price // $base_price;
# Если налоговая ставка не определена, то она равняется нулю.
$final = $price * (1 - ($tax_rate // 0));
# ----------------------------------------------------------
$default_config = 'default';
# Будет присвоено первое определенное значение.
$config_value = $ARGV[0] // $ENV{'PARAM'} // $default_config;
# ----------------------------------------------------------
$default_config = undef;
$config_value = $ARGV[0] // $ENV{'PARAM'} // $default_config;
# Процедура compute_expensive_value будет вызвана только если config_value
# не определена.
$config_value //= compute_expensive_value();
sub compute_expensive_value {
'computed'
}
print "$config_value\n";
</source>
=== Побитовые операции ===
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Побитовые операции'''</center>
|-
|<center><code><nowiki>&</nowiki></code></center>
|style="width:10%;"|<center><code>3 & 2</code></center>
|style="width:30%;"|'''Побитовое И'''. Выполняет конъюнкцию двух чисел побитово
|<center><code><nowiki>|</nowiki></code></center>
|style="width:10%;"|<center><code><nowiki>3 | 2</nowiki></code></center>
|style="width:30%;"|'''Побитовое ИЛИ'''. Выполняет дизъюнкцию двух чисел побитово
|-
|<center><code>^</code></center>
|<center><code>3 ^ 3</code></center>
|'''Побитовое исключающее ИЛИ'''
|<center><code>~</code></center>
|<center><code>~0</code></center>
|'''Побитовое отрицание'''
|-
|<center><code><<</code></center>
|<center><code>1 << 1</code></center>
|'''Побитовый сдвиг влево'''
|<center><code>>></code></center>
|<center><code>2 >> 1</code></center>
|'''Побитовый сдвиг вправо'''
|}
* Побитовые операции работают только с числами, если хотя бы один операнд является числовым типом.
* До версии 5.20 операции пытались автоматически работать со стоковыми операндами. Если '''хотя бы один''' операнд являлся строкой (которая не может быть сконвертирована в число, потому что записана не только цифрами), то побитово выполняются операции с кодом каждого символа, даже если другой операнд записан только цифрами. Если при этом строки разной длины, то меньшая из них дополняется символами <code>\000</code> до равенства. Но, как позже выяснилось, такое автоматическое поведение приводило к трудноуловимым ошибкам.
* Начиная с Perl 5.20, побитовые операции для числовых и строковых типов данных были строго отделены директивой <code>use feature 'bitwise'</code>, а с версии 5.28 она всегда включается автоматически. Операции <code>&</code>, <code>|</code>, <code>^</code>, <code>~</code> работают только с числовым типом данных, а <code>&.</code>, <code>|.</code>, <code>^.</code>, <code>~.</code> работают со строковым типом данных:<source lang="perl">
use feature "bitwise";
$a = "10";
$b = "12";
printf "string 'a': %vb\n", $a;
printf "number 'a': %06b\n", ($a + 0);
printf "string 'b': %vb\n", $b;
printf "number 'b': %06b\n", ($b + 0);
printf "a & b: %vb\n", ($a & $b);
printf "a &. b: %vb\n", ($a &. $b);
printf "a & b: %vb (numeric)\n", ($a + 0 & $b + 0);
</source><source lang="bash">
string 'a': 110001.110000
number 'a': 001010
string 'b': 110001.110010
number 'b': 001100
a & b: 111000
a &. b: 110001.110000
a & b: 111000 (numeric)
# Пояснения:
# До версии 5.20 интерпретатор будет завершаться с ошибкой, так как операций с точкой
# ещё не существовало. Директива выше гарантирует, что bitwise поддерживается.
# Так как оба операнда могут быть корректно сконвертированы в числа, то мы можем увидеть,
# что операция & работает с операндами как с числами (001010 & 001100 = 001000 или 8, что в
# в ASCII соответствует коду 56, который в двоичной системе 111000), а операция &. работает с
# каждым символом в строке по отдельности, поэтому получается результат 110001.110000.
</source>
* Все вещественные числа преобразуются к целым простым отбрасыванием дробной части:<source lang="perl">
# Выражение ...
$result = 3.5 & 5.9;
# ... и ...
$result = 3 & 5;
# ... работают одинаково.
</source>
* Допустимо использовать любой формат представления чисел: десятичный, шестнадцатеричный и восьмеричный.
* При выполнении поразрядных операций, внутренне операнды переводятся в IV или UV структуру, при этом отрицательные числа дополняются до двух. Разрядность UV / IV зависит от разрядности процессора, при этом сдвиги отрицательных чисел могут зависеть от компилятора, которым был собран интерпретатор Perl. В случае переполнения чисел в операндах, результаты не предсказуемы, поэтому для очень больших чисел вы должны использовать специализированные модули. Чтобы узнать внутреннее представление UV / IV, используйте команду<source lang="perl">
$ perl -V:ivsize
$ perl -V:uvsize
</source>
== Операции присваивания ==
{|class="wikitable" style="width:100%;"
|-
! Операция
! Пример
! Описание
! Операция
! Пример
! Описание
|-
| colspan="6" | <center>'''Операции присваивания'''</center>
|-
|<center><code>=</code></center>
|style="width:10%;"|<center><code>$i = 2</code></center>
|style="width:30%;"|'''Простое присваивание'''
|<center><code>**=</code></center>
|style="width:10%;"|<center><code>$i **= 2</code></center>
|style="width:30%;"|'''Возведение в степень с присваиванием'''
|-
|<center><code>+=</code></center>
|<center><code>$i += 2</code></center>
|'''Сложение с присваиванием'''
|<center><code>-=</code></center>
|<center><code>$i -= 2</code></center>
|'''Вычитание с присваиванием'''
|-
|<center><code>.=</code></center>
|<center><code>$i .= 2</code></center>
|'''Конкатенация с присваиванием'''
|<center><code>*=</code></center>
|<center><code>$i *= 2</code></center>
|'''Умножение с присваиванием'''
|-
|<center><code>/=</code></center>
|<center><code>$i /= 2</code></center>
|'''Деление с присваиванием'''
|<center><code>%=</code></center>
|<center><code>$i %= 2</code></center>
|'''Остаток от деления с присваиванием'''
|-
|<center><code>x=</code></center>
|<center><code>$i x= 2</code></center>
|'''Повторение с присваиванием'''
|<center><code>&=</code></center>
|<center><code>$i &= 2</code></center>
|'''Поразрядное И с присваиванием'''
|-
|<center><code><nowiki>|=</nowiki></code></center>
|<center><code><nowiki>$i |= 2</nowiki></code></center>
|'''Поразрядное ИЛИ с присваиванием'''
|<center><code>^=</code></center>
|<center><code>$i ^= 2</code></center>
|'''Поразрядное исключающее ИЛИ с присваиванием'''
|-
|<center><code><<=</code></center>
|<center><code>$i <<= 2</code></center>
|'''Поразрядный сдвиг влево с присваиванием'''
|<center><code>>>=</code></center>
|<center><code>$i >>= 2</code></center>
|'''Поразрядный сдвиг вправо с присваиванием'''
|-
|<center><code>&&=</code></center>
|<center><code>$i &&= 2</code></center>
|'''Конъюнкция с присваиванием'''
|<center><code><nowiki>||=</nowiki></code></center>
|<center><code><nowiki>$i ||= 2</nowiki></code></center>
|'''Дизъюнкция с присваиванием'''
|-
|<center><code>^^=</code></center>
|<center><code>$i ^^= 1</code></center>
|'''Исключающее ИЛИ с присваиванием'''<ref>Поддерживается с версии 5.42.</ref>
|<center><code>//=</code></center>
|<center><code>$value //= $default</code></center>
|'''Слияние с присваиванием'''
|}
* Простое присваивание является бинарной операцией, правый операнд которой является выражением, а левый — определяет участок памяти (в форме переменной), в который запишется результат выражения. Операция присваивания возвращает левый операнд как результат выражения. По этой причине следующая запись будет синтаксически правильной<source lang="perl">
($i = $j) = 5;
# Если развернуть эту конструкцию, то получается
$i = $j;
$i = 5; # Так как выражение в скобках вернет $i
</source>
* Как в языке Си, в Perl есть составное присваивание, совмещающее в себе операцию и присваивание. Операции с присваиванием также возвращают левый операнд, как результат выражения<source lang="perl">
$b = 1;
$a = ($b += 3); # Аналогично $a = $b = 4
$a += ($b += 3); # Аналогично $a = $a + $b + 3
(($a += 2) **= 2 ) -= 1; # Аналогично $a = ($a + 2) ** 2 - 1
</source>Обратим внимание, что в большинстве ситуаций в сложных выражениях ставить скобки для операций присваивания обязательно, потому что, как вы узнаете ниже, они парсятся интерпретатором справа налево.
== Списковые операции ==
''Списковая операция'' — это операция над списком значений. Операции, которым передаются списки и кажущиеся функциями, на самом деле являются списковыми операциями, например <code>print</code>. Это связано с тем, что списковые операции разрешают помещать свои аргументы в скобки. Так, следующие вызовы равнозначны
<source lang="perl">
print $a, "hello", $b;
print ($a, "hello", $b);
</source>
Списковые операции ожидают на входе список скаляров в некоторой форме, а на выходе отдают тот же список, но модифицированный некоторым образом, либо новый список. Так, следующие операции являются списковыми:
* Создание и конкатенация массивов<source lang="perl">
@array1 = (1,2,3);
@array2 = (4,5,6);
@array3 = (@array1, @array2);
</source>
* Встроенные операции, связанные с манипуляцией значением(ми) в массиве<source lang="perl">
@array = (1,2,3);
push @array, 4; # (1, 2, 3, 4)
pop @array; # (1, 2, 3); 4 возвращается как результат
shift @array; # (2, 3); 1 возвращается как результат
unshift @array, 5; # (5, 2, 3)
splice @array, 0, 2; # (3); (5, 2) возвращается как результат
</source>
* Трансформация (новый массив возвращается как результат)<source lang="perl">
@array = qw { a b c d e f };
# Применение предиката к каждому элементу в списке
print "$_\n" foreach map { $_ . $counter++ } @array;
#
# Вызов map в модификаторе foreach возвращает новый массив, каждый элемент которого
# печатается print слева от модификатора. В этом примере процедура предиката к каждому
# элементу исходного массива добавляет порядковый номер, в результате чего получается
#
# a0
# b1
# c2
# d3
# e4
# f5
#
# Сформировать новый массив, элементы которого хранятся в обратном порядке
print "$_\n" foreach reverse @array;
# f
# e
# d
# c
# b
# a
# Сортировка
use List::Util; # Подключаем модуль для перемешивания элементов для дальнейшего примера.
@array = List::Util::shuffle(@array); # Перемешиваем элементы в случайном порядке.
print "@{array}\n"; # Вывод будет отличаться при каждом вызове: "b f d a e c"
@array = sort @array; # Снова в алфавитном порядке.
print "@{array}\n"; # "a b c d e f"
</source>
* Фильтрующие операции (возвращают подмножество исходного массива как результат)<source lang="perl">
@array = qw { a 1 5 d 6 f 8 9 h j k l 25 };
@numbers = grep /\d+/, @array; # Достаем из исходного массива только цифры
print "@{numbers}\n"; # "1 5 6 8 9 25"
@letters = grep /[a-z]+/, @array; # Достаем из исходного массива только буквы
print "@{letters}\n"; # "a d f h j k l"
</source>
* Агрегирующие операции (как правило, возвращают все элементы массивов одним значением)<source lang="perl">
@words = qw { apple grapes banana };
$value = join ", ", @words; # объединяет все элементы и вставляет между ними разделитель.
print "${value}\n"; # "apple, grapes, banana"
</source>
* Разворачивающие операции (наоборот, из одного значения получают список)<source lang="perl">
@numbers = 1..5;
print "@{numbers}\n"; # "1 2 3 4 5"
$fruits = "apple, banana, grapes";
@fruits = split ", ", $fruits;
print "@{fruits}\n"; # "apple banana grapes"
</source>
Подробнее о пользовательских списковых операциях будет в главе, посвященной функциям.
=== Списковые операции all и any ===
Начиная с версии 5.42, в ядро интерпретатора были интегрированы две новые операции, помогающие работать с множествами без использования модулей. До этого эти операции приходилось подключать в виде функций из модуля <code>List::Util</code>. Вероятно, добавление этих операций в ядро было вдохновлено языком Python, в котором они существуют в виде операторов.
<source lang="perl">
any { <блок-предиката> } @list;
all { <блок-предиката> } @list;
</source>
Операции <code>all</code> и <code>any</code> мимикрируют под операцию <code>grep</code> и используются, чтобы вернуть логический ответ по предикату. Чтобы операция <code>all</code> вернула ИСТИНУ, необходимо чтобы её предикат вернул ИСТИНУ для каждого элемента списка. Соответственно, для операции <code>any</code> ИСТИНОЙ считается ситуация, когда предикат возвращает ИСТИНУ по меньшей мере для одного элемента списка.
Появление этих операций, хоть и с опозданием, очень кстати, так как различного рода проверки множеств — частая задача на практике. Вот лишь несколько примеров.
<source lang="perl">
use v5.42; # Директива требует интерпретатор не ниже указанной версии.
# Следующие директивы нужны по крайней мере для версии 5.42, так как на тот момент
# эти возможности были еще экспериментальными. В будущих версиях эти
# директивы не понадобятся.
use feature 'keyword_any', 'keyword_all'; # Включает операции
no warnings 'experimental::keyword_any', 'experimental::keyword_all'; # Отключает предупреждения
# Использование my в этом месте обусловлено тем, что директива use v5.42
# автоматически включает директиву strict (будет рассмотрено позже).
my @numbers = (2, 4, 6, 8, 10);
# Через специальную переменную $_ предикат получает очередной элемент списка.
if (all { $_ % 2 == 0 } @numbers) {
print "All numbers are even\n";
}
if (any { $_ > 9 } @numbers) {
print "At least one number is greater than 9\n";
}
</source>
Сравните этот код с программой, которую мы бы написали для версии интерпретатора меньше 5.42:
<source lang="perl">
use List::Util qw{ all any }; # Импортируем функции из модуля.
@numbers = (2, 4, 6, 8, 10);
# ____ Запятую можно опустить, так как у функции есть прототип. Для any она опущена.
# V
if (all { $_ % 2 == 0 }, @numbers) {
print "All numbers are even\n";
}
if (any { $_ > 9 } @numbers) {
print "At least one number is greater than 9\n";
}
</source>
Обратите внимание на то, что в старых версиях интерпретатора функции <code>all</code> и <code>any</code> всегда нужно импортировать из модуля <code>List::Util</code>. Однако не спешите полностью списывать этот модуль, так как в нём есть множество других полезных функций.
== Операции заключения в кавычки ==
Кавычки (одинарные, двойные и обратные) используются в Perl, чтобы задавать строковые литералы. Кроме этого есть еще операции, которые внешне похожи на операции заключения в кавычки, и перечислены в таблице ниже.
{|class="wikitable" style="width:100%;"
|-
! Операция
! Эквивалент
! Описание
! Операция
! Эквивалент
! Описание
|-
| colspan="6" | <center>'''Операции заключения в кавычки'''</center>
|-
|<center><code>q{}</code></center>
|style="width:10%;"|<center><code><nowiki>''</nowiki></code></center>
|style="width:30%;"|'''Строковый литерал'''. Подстановки невозможны<ref>Под этим понимается, что не происходит разрешение (''evaluating'') подстрок, начинающихся с сигилов.</ref>
|<center><code>qq{}</code></center>
|style="width:10%;"|<center><code>""</code></center>
|style="width:30%;"|'''Строковый литерал'''
|-
|<center><code>qx{}</code></center>
|<center><code><nowiki>``</nowiki></code></center>
|'''Команда системы'''
|<center><code>qw{}</code></center>
|<center><code><nowiki>()</nowiki></code></center>
|'''Список слов'''. Подстановки невозможны
|-
|<center><code>m{}</code></center>
|<center><code><nowiki>//</nowiki></code></center>
|'''Поиск по регулярному выражению'''
|<center><code>qr{}</code></center>
|<center><code><nowiki>//</nowiki></code></center>
|'''Шаблон регулярного выражения'''
|-
|<center><code>s{}{}</code></center>
|<center><code>s///</code></center>
|'''Подстановка'''
|<center><code>tr{}{}</code></center>
|<center><code><nowiki>y///</nowiki></code></center>
|'''Транслитерация'''. Подстановки невозможны
|}
* Фигурные скобки в данных операциях представляют собой разделитель. Они могут быть в любой момент заменены на другой символ или любую другую пару скобок, например<source lang="perl">
q{hello}
q/hello/
q!hello!
q<\<hello\>> # Если символы разделителя есть в значении, то они должны экранироваться.
</source>Внутри разделителей разрешается любое число пробелов, а также внутри большинства операций разрешены подстановки, кроме некоторых (указанных в таблице отдельно).
* Операция <code>qw{}</code> позволяет вернуть список слов. Чаще всего она используется, чтобы инициализировать массив.<source lang="perl">
@arr = qw{ one two three };
# Это аналогично
@arr = ("one", "two", "three");
# и
$arr[0] = "one";
$arr[1] = "two";
$arr[2] = "three";
</source>Обратите внимание, что внутри <code>qw{}</code> запятые ставить не нужно: разделителями являются пробелы.
* Об остальных операциях будет рассказано далее по ходу изложения.
=== Операция Here-docs ===
В Perl перекочевала Here-docs операция, придуманная для командной оболочки Bourne Shell, которая позволяет инициализировать переменные многострочными строками, либо передавать их на вход некоторой операции, записывая строки прямо в исходном файле программы. Как и в Bourne Shell она записывается так
<source lang="perl">
$str = <<EOF;
строка 1
строка 2
строка 3
EOF
print <<END;
Hello, World!
END
</source>
Здесь после знака <code><<</code> вводится так называемое стоп-слово. Далее записывается многострочная строка. Интерпретатор будет искать стоп-слово, для того чтобы понять где заканчивается эта строка. Стоп-слово может быть любым строковым литералом. В наших примерах стоп-словами были <code>EOF</code> и <code>END</code>.
За стоп-словом обычно следует ставить символ точки с запятой, так как Here-docs является простым оператором, конец которого находится после ввода стоп-слова. Пропуск точки с запятой является очень частой ошибкой. Тем не менее, если оператор Here-docs является единственным или последним в текущем блоке, точку с запятой можно опускать.
По умолчанию многострочная строка записывается так, как будто она находится в двойных кавычках. Таким образом, в ней будут разрешаться все подстановки и управляющие последовательности. Вы можете явно обозначить, как должен поступать интерпретатор, если будете использовать соответствующие кавычки вокруг стоп-слова.
<source lang="perl">
$var = "Hello";
print <<END;
\t$var, World!
END
# Аналогично предыдущему вызову
print <<"END";
\t$var, World!
END
# С одинарными кавычками переменные перестанут подставляться и
# не будут работать управляющие последовательности
print <<'END';
\t$var, World!
END
</source>
Можно также использовать наклонные кавычки, тогда в Here-docs можно писать процедуры командной оболочки и инициализировать переменные результатом работы этих процедур. Каждая строка в таких процедурах это отдельный ввод команды в оболочку. Следует помнить, что результаты могут зависеть от операционной системы, в которой исполняется Perl.
<source lang="perl">
# Выведет каталоги корневой точки монтирования в *nix системе.
print <<`END`;
ls -l /
END
</source>
Если стоп-слово вводится без кавычек, то нельзя ставить пробелы между <code><<</code> и стоп-словом. Если такое случится, то Perl не распознает такого слова и будет захватывать строки до первой пустой строки в исходном файле.
В одном операторе можно ввести больше одного стоп-слова (когда это удобно), если записать их подряд следующим образом.
<source lang="perl">
print <<"END1".<<'END2';
double quotes
END1
single quotes
END2
</source>
По умолчанию, Here-docs сохраняет все лидирующие пробелы в многострочной строке, а также требует, чтобы стоп-слово всегда находилось в первой колонке. Например,
<source lang="perl">
print <<END;
ONE
TWO
THREE
END
</source>
напечатает
<pre>
ONE
TWO
THREE
</pre>
Такое поведение не всегда удобно, особенно, когда Here-docs вложена в некоторый блок: в этом случае в исходном коде нарушается выравнивание, из-за чего его неудобно читать. Сравните
<source lang="perl">
# Операция размещена в блоке, но мы не можем выровнять отступы как нам хочется, а также
# стоп-слово END должно всегда начинаться с первой колонки.
if (1) {
print <<END;
ONE
TWO
THREE
END
}
</source>
С версии 5.26 для Here-docs была добавлена особая форма (<code><<~</code>), которая вычисляет отступ для многострочной строки не от колонки документа с исходным кодом, а от отступа самого стоп слова. Таким образом, с версии 5.26 тот же фрагмент можно записать с сохранением исходных отступов так:
<source lang="perl">
# С версии 5.26
if (1) {
print <<~END;
ONE
TWO
THREE
END
# ^- отступ для многострочной строки вычисляется от этой колонки.
}
</source>
Операция Here-docs может комбинироваться с другими операциями. Для этого удобно пользоваться мнемоническим приемом, в котором нужно представлять, что очередная строка заменяет собой стоп-слово справа от знака <code><<</code>. Вот несколько примеров:
<source lang="perl">
# Каждая строка подается операции uc, которая переводит символы в верхний регистр.
print uc(<<EOF);
one
two
three
EOF
# Результат:
# ONE
# TWO
# THREE
# Удалит лидирующие пробелы для каждой строки.
print <<'EOF' =~ s/^\s+//mgr;
Line one with leading spaces
Line two with leading spaces
EOF
# Результат:
# Line one with leading spaces
# Line two with leading spaces
# При выводе строк будет приписывать к каждой порядковый номер.
sub numbering {
print ++$counter . ": " . $_ . "\n" for split '\n', $_[0];
}
numbering(<<'EOF');
int main(int argc, char** argv)
{
return 0;
}
EOF
# Результат:
# 1: int main(int argc, char** argv)
# 2: {
# 3: return 0;
# 4: }
# Напечатает между строками промежуточную.
print <<'PART1' . "Middle String\n" . <<'PART2';
This is the first part.
PART1
This is the final part.
PART2
# Результат:
# This is the first part.
# Middle String
# This is the final part.
</source>
== Другие операции ==
=== Диапазон ===
Бинарная операция диапазон <code>..</code> по-разному интерпретируется в скалярном и списковом контекстах.
В списковом контексте операция возвращает список из чисел, начиная с левого операнда и до последнего с шагом 1, если оба операнда являются числами, либо строки, которые будут сгенерированы в лексикографическом порядке. Если операндами являются числа, то левый операнд всегда должен быть меньше правого, иначе операция вернет пустой список. Числа также должны быть всегда целыми (если это не так, то дробная часть будет просто отбрасываться).
Если строка-левый операнд в лексикографическом смысле больше правого, то результат может зависеть от версии интерпретатора <code>perl</code>: в старых версиях по умолчанию просто возвращается левый операнд; в версии 5.32 будет возвращен ряд, начиная с большего операнда и до символа <code>z</code>. Кроме того, нельзя использовать символы из других алфавитов, кроме латинского: для других алфавитов всегда возвращается левый операнд как результат.
<source lang="perl">
(1..5); # 1 2 3 4 5
(-3..5); # -3 -2 -1 0 1 2 3 4 5
("a".."d"); # a b c d
("01".."10"); # 01 02 03 04 05 06 07 08 09 10
("a1".."b2"); # a1 a2 a3 ... a9 b1 b2
</source>
В скалярном контексте диапазон возвращает булево значение и эмулирует поведение операции запятая <code>,</code> из редакторов Sed и AWK (например, конструкция <code>1,3p</code>). Алгоритм поведения может показаться сложным при первом прочтении, тем не менее следует познакомиться с ним:
* Диапазон в скалярном контексте всегда находится в одном из двух состояний, которое может измениться при повторном вычислении. Условно мы назовем их ИСТИНА и ЛОЖЬ.
* Диапазон остается в ЛОЖНОМ состоянии до тех пор, пока ЛОЖНЫМ остается значение левого операнда. Как только он становится ИСТИНОЙ, диапазон переключает состояние в ИСТИНУ и остается в нем, пока правый операнд не станет ИСТИННЫМ. Когда это происходит, диапазон снова переключается в ЛОЖНОЕ состояние.
* В ЛОЖНОМ состоянии этот диапазон возвращает пустую строку (или ЛОЖЬ). В состоянии ИСТИНА при каждом повторном вычислении возвращается порядковый номер, начиная с 1.
* В момент перехода из ИСТИНЫ в ЛОЖЬ диапазон возвращает строку, в которой к последнему порядковому номеру добавляется <code>"E0"</code>, например <code>2E0</code>. В ИСТИННОМ состоянии <code>E0</code> будет отбрасываться.
Вот собственно и весь алгоритм. Добавление <code>"E0"</code> при смене состояния эмулирует поведение именно утилиты AWK. В Sed добавление этой строки происходит только на следующем вычислении. Чтобы эмулировать именно поведение Sed, нужно использовать три точки <code>...</code>.
Диапазоны в скалярном контексте в Perl обычно используются при чтении файлов.
==== Использование диапазона в условном контексте ====
Диапазоны Perl в условном контексте могут использоваться для программирования диапазонов Sed и AWK. Ниже показан небольшой пример с блоком <code>__DATA__</code>, в котором хранятся данные программы.
<source lang="perl">
while (<DATA>) {
if (/START/ .. /END/) {
print;
}
}
__DATA__
Ignore this line
START
Data line 1
Data line 2
END
Ignore this line too
</source>
<pre>
START
Data line 1
Data line 2
END
</pre>
Программа использует специальный дескриптор <code>DATA</code>, по которому читается блок строк, записанный в исходном файле после макроса <code>__DATA__</code>. С помощью диапазона, мы фильтруем всё в этом блоке, кроме строк между строками <code>START</code> и <code>END</code>. Когда под проверку регулярным выражением <code>/START/</code> попадает строка <code>START</code>, диапазон переключается в состояние ИСТИНА, так как совпадение есть, и остается в этом состоянии до тех пор, пока проверка по регулярному выражению <code>/END/</code> возвращает ЛОЖЬ. Соответственно, когда <code>/END/</code> возвращает ИСТИНУ, то диапазон переключается в ЛОЖНОЕ состояние, и вывод строк прекращается.
В предыдущем примере операции <code>..</code> и <code>...</code> работают одинаково. Разницу между ними можно показать на таком примере:
<source lang="perl">
@lines = ( "START END", "data", "END" );
print "Operation ..\n";
foreach (@lines) {
print "Parsing: $_\n" if /START/ .. /END/;
}
print "\nOperation ...\n";
foreach (@lines) {
print "Parsing: $_\n" if /START/ ... /END/;
}
</source>
<pre>
Operation ..
Parsing: START END
Operation ...
Parsing: START END
Parsing: data
Parsing: END
</pre>
Обратите внимание, что при операции <code>..</code> напечаталась только первая строка, а при операции <code>...</code> — все строки. Это произошло потому, что операция <code>..</code> перешла в ложное состояние сразу на первой итерации, потому что оба её операнда были проверены одновременно. Именно наличие строк <code>START</code> и <code>END</code> в одной большой строке сбивает <code>..</code>, но этого не происходит с <code>...</code>, потому что второй операнд проверяется только при следующем обращении к операции.
Очень часто в таком контексте эти операции используются, чтобы читать некоторые текстовые файлы, содержимое которых вам известно. Например, трюк про чтение строк в файле по диапазону:
<source lang="perl">
# Пусть DATA это наш файл. Следующий код читает в этом файле строки,
# начиная с 3 и заканчивая 6.
while (<DATA>) {
if (3 .. 6) {
print;
}
}
__DATA__
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
</source>
<pre>
line 3
line 4
line 5
line 6
</pre>
==== Оператор Yada Yada ====
Начиная с версии 5.12, операцию <code>...</code> можно использовать как заглушку. В сообществе Perl в таком контексте оператор называется Yada Yada<ref>Yada Yada — это сленговое словечко, которое можно перевести на русский примерно как ''«и так далее и тому подобное»''. Оно используется, когда говорящий хочет отбросить несущественные для изложения детали, чтобы перейти сразу к сути. В контексте программирования это может означать, что конкретная реализация в этом месте подразумевается, но для текущего изложения какова она — это не важно. Эта фраза попала в Perl благодаря сериалу «[[w:Сайнфелд (телесериал)|Сайнфелд]]» 1997 года, в котором в серии «The Yada Yada» персонажи постоянно использовали эту фразу, чтобы замалчивать пикантные или неловкие детали своей жизни:<blockquote>«Мы пошли к нему домой, поужинали, yada yada yada, и я больше не могу ходить в эту церковь».</blockquote></ref>. В языке Python, наиболее близким по смыслу к Yada Yada является оператор <code>pass</code>.
Пример:
<source lang="perl">
use v5.12; # Разрешено использовать только с 5.12
sub concrete_implementation {
my ($arg) = @_;
...
# TODO: Пока еще не придумал, что здесь делать.
}
# ...
# В этом месте мы должны вызвать эту реализацию ...
concrete_implementation(123);
# ...
</source>
<pre>
Unimplemented at ./script.pl line 8.
</pre>
=== Операция запятая ===
Операция запятая <code>,</code> является бинарной и ведет себя по-разному в скалярном и списковом контекстах:
* в списковом контексте она является разделителем для элементов в списке;
* в скалярном контексте она сначала вычисляет левый операнд, потом правый и возвращает результат правого операнда как общий результат.
<source lang="perl">
# Так как левый операнд присваивания это переменная на массив, то выражение исполняется в списковом контексте.
# В этом примере запятая разделяет элементы списка, который передается конструктору массива.
@arr = (1, 2);
# Теперь выражение выполняется в скалярном контексте. Оба операнда для запятой являются простыми числами, но
# как результат операции, будет возвращена 2, которая будет присвоена скаляру.
$scalar = (1, 2);
</source>
У запятой есть синоним в виде <code>=></code>, который мы ранее использовали для построения хеш-массивов в конструкторе. В основном этот знак повторяет запятую, но требует чтобы левый операнд всегда имел строковый тип и корректно в него конвертировался.
Операция является излюбленным инструментом трюков интерпретации. Например, следующая конструкция по порядку вызовет все процедуры, при этом в первой печати мы попутно захватываем результат вызова процедуры <code>b</code>, пользуясь тем, что операция используется в списковом контексте, в котором мы можем пользоваться индексацией массива, а во втором случае, выполняя все в скалярном контексте, мы получаем результат процедуры <code>c</code>:
<source lang="perl">
sub a { print "1\n"; "a" }
sub b { print "2\n"; "b" }
sub c { print "3\n"; "c" }
print STDOUT ( &a, &b, &c )[1], "\n";
print STDOUT scalar ( &a, &b, &c ), "\n";
</source>
<pre>
1
2
3
b
1
2
3
c
</pre>
=== Тернарная операция ===
В Perl есть тернарная условная операция, которая есть во многих языках программирования. Она записывается точно также как в Си:
<source lang="perl">
<операнд 1> ? <операнд 2> : <операнд 3>
</source>
Операция работает так. Если <code><операнд 1></code> является ИСТИНОЙ, то возвращается <code><операнд 2></code> как результат тернарной операции, иначе возвращается <code><операнд 3></code>. Результат тернарной операции можно использовать как в левосторонних (''lvalue''), так и в правосторонних выражениях (''rvalue''), главное чтобы они подставлялись в правильном семантическом контексте.
<source lang="perl">
$var = ($num % 3) ? ($var1 += 1) : ($var1 += 2);
(($a % 3) ? ($a += 2) : $a) -= 2; # Пример с lvalue выражением
</source>
=== Ссылочные операции ===
Большую часть времени мы ссылаемся на данные в памяти компьютера через переменные. Однако язык Perl, подобно Си, разрешает ссылаться на данные в памяти с помощью ''указателей'' или ''ссылок'' (в Perl эти термины равнозначны), которые хранят адрес на ячейку в памяти как значение. Ссылочная передача удобна, когда одни и те же данные разделяют множество процедур и при этом не нужно привязываться к конкретным именам или типам в тексте программы. Возможно процедура сама должна разобраться, что хранится в памяти по переданной ссылке и принять решение самостоятельно.
Чтобы получить адрес переменной, нужно перед ее именем написать обратный слеш <code>\</code> (это аналогично операции получения адреса <code>&</code> в языке Си).
<source lang="perl">
# Ссылка на скаляр
$var = 5;
$ptr = \$var; # Теперь здесь хранится адрес $var
# Ссылка на массив
@arr = (1,2,3);
$aptr = \@arr;
# Ссылка на хеш-массив
%hash = (name => "Larry", surname => "Wall");
$hptr = \%hash;
</source>
Обратите внимание, что адреса хранятся в скалярной переменной. Если мы распечатаем значения, то получим примерно следующее:
<source lang="">
SCALAR(0x800075938)
ARRAY(0x8000759b0)
HASH(0x800075aa0)
</source>
Обратите внимание, что в ссылке хранится информация о типе объекта, на который она ссылается и шестнадцатеричный адрес в памяти компьютера.
Чтобы выполнить обратную операцию, т.е. получить данные по ссылке, ее нужно ''разыменовать''. В отличие от Си, в Perl разыменовывание привязано к типу данных, на который она ссылается. Для этого нужно перед именем ссылки поставить тип, на который будет вестись разыменовывание.
<source lang="perl">
# Разыменовываем ссылку на хеш-массив, чтобы передать его функции keys, которая извлечет из него ключи
@keys = keys(%$hptr);
print $$ptr, "\n"; # Разыменовываем указатель на скаляр
</source>
В предыдущем примере с хеш-массивом мы сначала разыменовали ссылку на хеш-массив, указав символ <code>%</code> в начале, а только потом работали с массивом как обычно, передав его функции <code>keys</code>. Perl позволяет также обращаться к данным массивов непосредственно из ссылки (когда это удобно) при помощи операции разыменовывания массивов <code>-></code>.
<source lang="perl">
print $aptr->[0], $hptr->{name}, "\n";
</source>
Подробнее ссылки мы рассмотрим в отдельной главе (''см.'' [[{{Root book name}}/Ссылки|Ссылки]]).
=== Операции связывания ===
Регулярные выражения являются визитной карточкой Perl, который снабжен различными операциями для проверки по ним. Сюда входят поиск (<code>m//</code>), подстановка (<code>s///</code>) и замена (<code>tr///</code>). По умолчанию они работают с переменной <code>$_</code>.
Кроме них есть операции связывания <code>=~</code> и <code>!~</code>, которые выражают соответственно ''совпадает с шаблоном'' и ''не совпадает с шаблоном''.
Регулярные выражения являются очень обширной темой в Perl, поэтому они будут рассмотрены в отдельной главе (''см.'' [[{{Root book name}}/Работа со строками и регулярные выражения|Работа со строками и регулярные выражения]]).
==== Умное связывание ====
Начиная с 5.10.1 и до 5.37.10 в Perl поддерживалась операция умного связывания, которая умеет сравнивать переменные, хранящие разные типы данных. Данная бинарная операция обозначается двумя тильдами <code>~~</code> и изначально была введена для поддержки оператора <code>given..when</code> (в котором она используется неявно), о котором немного рассказано в следующей главе (см. [[Некоторые сведения о Perl 5/Операторы#Given..when|Операторы#Given..when]]).
Эта операция является особенной, так как её контекст определяется не на этапе компиляции, а во время исполнения программы. Для этого она определяет какой тип данных хранится в её операндах и, в зависимости от этих типов, выбирает механизм сравнивания, причем фактические типы в операндах не обязательно должны совпадать, что и делает её «умной». Если в понимании выбранного механизма операнды равны, она возвращает 1, иначе пустую строку <code>""</code>.
В Perl 5.37.10 данная операция была отмечена как неудачный эксперимент и окончательно будет вырезана в 5.42. Здесь мы о ней упоминаем, чтобы предостеречь не использовать её, хотя следует отметить сколько релизов ей удалось пережить.
=== Именованные унарные операции ===
В Perl есть большое число встроенных функций с одним аргументом, которые с точки зрения синтаксического анализатора являются ''унарными именованными операциями''<ref>Слово ''именованный'' подчеркивает тот факт, что у операции есть имя в виде обозначающего слова, при этом они не требуют скобок вокруг аргумента, копируя операции с одним символом.</ref>. Такие операции подобны функциям, но не требуют скобок вокруг параметра, как того требуют простые функции. О том, является ли функция такой операцией, можно узнать из документации. К таким операциям относятся например <code>do</code>, <code>eval</code>, <code>return</code>, <code>goto</code>, <code>sin</code>, <code>sqrt</code> и другие, а также все операции проверок файлов типа <code>-e</code> (файл существует), <code>-w</code> (в файл можно писать) и другие.
Ключевая особенность именованных унарных операций в Perl заключается в их приоритете: они имеют более высокий приоритет, чем большинство бинарных операций, но ниже, чем скобки и операция стрелки (<code>-></code>).
По ходу изложения мы затронем многие из этих операций.
=== Операции ввода/вывода ===
Это операции, которые направлены на вывод результатов в файлы или ввод данных в программу из них. Так, унарную именованную операцию <code>print</code> можно рассматривать как операцию вывода.
Чтобы обеспечить ввод данных в программу из файлов, нужно сначала их открыть и получить специальный программный объект, называемый ''дескриптором файла''. Дескриптор файла может быть получен через операцию в виде угловых скобок <code><дескриптор_файла></code>:
<source lang="perl">
open(DFILE, "net.cfg"); # Открываем файл. Идентификатор дескриптора DFILE может быть произвольным
@content = <DFILE>; # Читаем файл в массив
</source>
Если бы мы открыли файл на запись, то мы можем перенаправить запись в него так
<source lang="perl">
print MYFILE "Hello";
</source>
Тема ввода/вывода является очень обширной, поэтому она будет рассмотрена в отдельной главе (''см.'' [[{{Root book name}}/Ввод и вывод|Ввод и вывод]]).
== Выражения ==
Понимание того, как интерпретатор Perl парсит выражения, поможет вам лучше понять как они должны составляться. ''Выражение'' — это несколько операндов, объединенных одной и более операциями. Операнд в свою очередь также может быть выражением, т.е. одно общее выражение это конгломерат подвыражений.
Синтаксический анализатор Perl, во время разбора выражения, пытается выделить в нем элементарные члены — ''термы''<ref>Если делать сравнение с естественным языком, то терм является тем же самым, что и ''слово'' в предложении.</ref>, а потом соединить их знаками операций, причем он выстраивает операции в некотором порядке, учитывая приоритет.
В Perl термами являются литералы, переменные, выражения в скобках, закавыченная строка символов, а также функции с параметрами в скобках. Только терм может быть операндом. Отметим, что в Perl отсутствуют истинные функции: по существу они являются списковыми, унарными именованными операциями, ведущими себя как функции. Вызывая функцию, мы выполняем списковую или унарную операцию, которая возвращает некоторый результат.
<source lang="perl">
# Следующее выражение демонстрирует списковую операцию. В ней сначала
# вычисляется как терм каждый элемент списка, а затем каждый элемент выводится
# на печать списковой операции.
print 2 + 2 * 25 / 4, ' ', 16; # Напечатает '14.5 16'
# Следующее выражение дает аналогичный результат. Избыточные скобки
# порождают массив, передаваемый операции.
print (2 + 2 * 25 / 4, ' ', 16); # Напечатает '14.5 16'
# Теперь попробуем добавить конкатенацию:
print (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '14.5 16'
# Обратите внимание, что результат конкатенации потерялся (нет символа '$'
# в выводе). Это произошло потому, что левый операнд конкатенации, как терм
# по приоритету вычисляется первым, т.е. print выводит результат своего терма
# в аргументе, а не результат конкатенации.
# Допустимо
print print (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '14.5 161$'
# Появление единицы объясняется тем, что внутренний print вернул код 1, который
# был преобразован в строку и был объединен конкатенацией
# c '$'. Так как между внутренним и внешним print нет переноса
# строки, получилась такая склеенная строка.
</source>
При синтаксическом разборе выражений и операторов, как термы рассматриваются конструкции <code>do{}</code> и <code>eval{}</code>, вызовы подпрограмм и методов объектов, анонимные конструкторы массивов скаляров и хешей, а также все операции ввода/вывода.
Еще один немаловажный термин это ''контекст операции''. Операции и термы вычисляются в некотором контексте, от которого зависит поведение операции и возвращаемое ей значение. Существует два основных контекста: ''скалярный'' и ''списковый''. В скалярном контексте интерпретатор пытается вывести из терма скаляр, а в списковом контексте — список литералов <code>qw{}</code>. Контекст определяет обычно тип данных левого операнда. Так, если он является скаляром, то операция выполняется в скалярном контексте; если массив скаляров — списковом контексте. Некоторые операции способны распознавать в каком контексте они исполняются и возвращать свой результат в зависимости от него (универсальные операции).
<source lang="perl">
# В списковой операции print перед списком можно указать выходной дескриптор:
print STDOUT (2 + 2 * 25 / 4, ' ', 16) . '$'; # Напечатает '16$'
# Потеря 14.5 Объясняется тем, что левый операнд конкатенации
# находится в скалярном контексте, а в нем операция запятая
# возвращает последний операнд как результат.
# Уберем скобки:
print STDOUT 2 + 2 * 25 / 4, ' ', 16 . '$'; # Напечатает '14.5 16$'
# Теперь каждый элемент списка после вычисления
# передается списковой операции, каждый в скалярном контексте.
</source>
Так как в Perl типизация динамическая<ref>Другими словами, все операции в Perl изначально перегружены.</ref>, понятие контекста операции является аналогом операции ''приведения типов данных'', которая есть в типизированных языках программирования. В большинстве ситуаций Perl знает лучше, в каком контексте вызывать операцию, но иногда приходится ему помогать, используя синтаксические конструкции и специальные функции. Умение предсказывать, в каком контексте выполнится операция в выражении, позволяет программисту Perl придумывать подчас очень запутанные (но с другой стороны короткие) конструкции, которые не могут себе позволить другие языки программирования из-за типизации. Мы рассмотрим некоторые случаи ниже.
<source lang="perl">
# В простом случае левый операнд задает контекст операции.
@arr = ("apple", "pear", "grapes", "banana");
# Левый операнд скаляр, а значит присваивание работает в скалярном контексте.
# В скалярном контексте массивы в правом операнде приводятся к их размеру.
$scalar = @arr;
print "$scalar\n";
# Левый операнд список скаляров, а значит присваивание работает в списковом контексте.
# В списковом контексте присваивание будет копировать элементы из массива в правом операнде
# поэлементно в список в левом операнде. При этом список слева не должен превышать размера массива.
( $element1, $element2, $element3 ) = @arr;
print $element1
. " $element2"
. " $element3\n";
# Если слева будет переменная на массив, операция также будет в списковом контексте,
# и правый массив переопределит значение переменной.
@arr1 = (1..4);
@arr1 = @arr;
print "@arr1\n";
#-------------------------------------------------------------------------------------------------------
# Операция print всегда работает в списковом контексте и все элементы списка пытается интерпретировать
# как строки.
# В стандартной библиотеке Perl есть функция localtime, которая в списковом контексте возвращает
# список из 9 элементов, кодирующих текущую дату.
print localtime; print "\n";
# Выведет примерно такое: 3219121301251120
# Однако, localtime умеет работать в скалярном контексте, в котором выводит дату в формате текущей локали,
# но этот контекст не может использоваться по умолчанию, так как компилятор только знает о том, что
# print умеет работать в списковом контексте.
#
# Этот тот случай, когда мы можем подсказать компилятору выполнить localtime в скалярном контексте,
# чтобы напечатать дату в читаемой форме. Для этого нужно воспользоваться функцией scalar, которая
# принуждает интерпретировать выражение в своем аргументе исключительно в скалярном контексте.
print scalar localtime; print "\n";
# В локали LANG_EN будет печататься в формате "Mon Jan 13 12:32:17 2025".
# Можно поступить проще и привести компилятор к скалярному контексту через другую операцию, которая
# этот контекст использует. Например, операция конкатенации строк всегда работает в скалярном контексте.
# Если компилятор увидит выражение, использующее скалярный контекст, он будет использоваться для всех
# операндов операции. Таким образом, такого же результата мы добиваемся, если напишем так:
print localtime . "\n";
# "Mon Jan 13 12:32:17 2025"
#-------------------------------------------------------------------------------------------------------
# Рассмотрим более сложный пример.
# Пусть дана такая строка:
$word = "111example222";
# Вопрос: как посчитать в ней количество символов цифр и букв и совместить это с печатью в одном компактном выражении?
# Для ответа на вопрос "сколько символов данного класса?" здесь следует использовать регулярные выражения.
# Так как о регулярных выражениях мы будем говорить много позже, возьмите на веру, что регулярное выражение для
# поиска цифр выглядит так '/\d/g', а букв так '/[^\d\s]/g'.
#
# Примечание: '/[^\d\s]/g' не учитывает Unicode символы.
#
# Проблема кроется в том, что регулярные выражения умеют работать и в скалярном, и в списковом контекстах.
# Конкретно нам нужен списковый контекст, в котором операция возвращает массив совпадений по шаблону, который
# мы могли бы преобразовать в размер, тем самым ответив на вопрос "сколько?". Но как нам сказать, чтобы операция
# выполнялась в списковом контексте, а не скалярном, ведь специальной функции типа scalar для этого нет?
#
# Единственный способ сделать это, привести компилятор к этому контексту через другую операцию.
# Существует два распространенных приёма провоцировать списковый контекст:
# * Можно использовать операцию присваивания, в которой левый операнд это пустой массив.
# * Можно использовать операцию разыменовывания ссылки, которая будет работать в контексте типа
# разыменовывания.
# Ниже мы в одном выражении используем оба приема для демонстрационных целей
print "Number of letters: "
. ( () = $word =~ /[a-zA-Z]/g ) . "\n"
. "Number of digits: "
. ( @{ [ $word =~ /\d/g ] } ) . "\n"
;
# Number of letters: 7
# Number of digits: 6
</source>
Не расстраивайтесь, если вы ничего из предыдущих примеров не поняли, так как мы сильно забегаем в них вперед. Эти примеры призваны показать, как сильно выражения завязаны на контекст операции.
Скалярный контекст также можно разделить по типу хранимых данных на ''числовой'', ''строковый'' и ''безразличный''. Perl неспособен заранее распознать этот контекст, поэтому он просто подключает механизм неявного приведения данных, когда скаляры в операндах хранят разные типы.
Еще один специальный скалярный контекст — ''булевый''. Так как в Perl нет булева <code>true</code> или <code>false</code>, Perl анализирует строки и числа в булевом контексте, как это было описано выше: <code>0</code>, <code>"0"</code>, <code>"00"</code>, <code>"0.0"</code> и <code>""</code> это условно ЛОЖЬ, а все остальное ИСТИНА.
Еще одним контекстом является void-контекст, который используется, когда в выражении нет побочных эффектов. Так, вы можете спокойно писать в Perl такие бессмысленные конструкции (они выполняются в void-контексте):
<source lang="perl">
(1,2,3);
$n;
"Hello";
</source>
Этот контекст можно обнаружить, если интерпретатор Perl запущен в режиме вывода предупреждающих сообщений.
Еще один контекст это ''подстановочный контекст'', в котором вычисляются операции заключения в кавычки (кроме одинарных кавычек). В этом контексте подставляются переменные и интерпретируются управляющие последовательности.
Ниже для справки представлены приоритеты операций.
{|class="wikitable" style="width:100%;"
|-
! Приоритет
! Операция
! Сочетаемость
|-
|style="width:10%;"|1
|Вычисление термов и левосторонних списковых операций
|style="width:20%;"|Слева направо
|-
|2
|<code><nowiki>-></nowiki></code>
|Слева направо
|-
|3
|<code><nowiki>++</nowiki></code> <code><nowiki>--</nowiki></code>
|Не сочетаются
|-
|4
|<code><nowiki>**</nowiki></code>
|Справа налево
|-
|5
|<code><nowiki>!</nowiki></code> <code><nowiki>~</nowiki></code> <code><nowiki>\</nowiki></code> унарный <code><nowiki>+</nowiki></code> унарный <code><nowiki>-</nowiki></code>
|Справа налево
|-
|6
|<code><nowiki>=~</nowiki></code> <code><nowiki>!=</nowiki></code>
|Слева направо
|-
|7
|<code><nowiki>*</nowiki></code> <code><nowiki>/</nowiki></code> <code><nowiki>%</nowiki></code> <code><nowiki>x</nowiki></code>
|Слева направо
|-
|8
|<code><nowiki>+</nowiki></code> <code><nowiki>-</nowiki></code> <code><nowiki>.</nowiki></code>
|Слева направо
|-
|9
|<code><nowiki><<</nowiki></code> <code><nowiki>>></nowiki></code>
|Слева направо
|-
|10
|Именованные унарные операции
|Не сочетаются
|-
|11
|<code><nowiki><</nowiki></code> <code><nowiki>></nowiki></code> <code><nowiki><=</nowiki></code> <code><nowiki>>=</nowiki></code> <code><nowiki>lt</nowiki></code> <code><nowiki>gt</nowiki></code> <code><nowiki>le</nowiki></code> <code><nowiki>ge</nowiki></code>
|Не сочетаются
|-
|12
|<code><nowiki>==</nowiki></code> <code><nowiki>!=</nowiki></code> <code><nowiki><=></nowiki></code> <code><nowiki>eq</nowiki></code> <code><nowiki>ne</nowiki></code> <code><nowiki>cmp</nowiki></code>
|Не сочетаются
|-
|13
|<code><nowiki>&</nowiki></code>
|Слева направо
|-
|14
|<code><nowiki>|</nowiki></code> <code><nowiki>^</nowiki></code>
|Слева направо
|-
|15
|<code><nowiki>&&</nowiki></code>
|Слева направо
|-
|16
|<code><nowiki>||</nowiki></code>
|Слева направо
|-
|17
|<code><nowiki>..</nowiki></code> <code><nowiki>...</nowiki></code>
|Не сочетаются
|-
|18
|<code><nowiki>?:</nowiki></code>
|Справа налево
|-
|19
|<code><nowiki>=</nowiki></code> <code><nowiki>**=</nowiki></code> <code><nowiki>+=</nowiki></code> <code><nowiki>-=</nowiki></code> <code><nowiki>.=</nowiki></code> <code><nowiki>*=</nowiki></code> <code><nowiki>/=</nowiki></code> <code><nowiki>%=</nowiki></code> <code><nowiki>x=</nowiki></code> <code><nowiki>&=</nowiki></code> <code><nowiki>|=</nowiki></code> <code><nowiki>^=</nowiki></code> <code><nowiki><<=</nowiki></code> <code><nowiki>>>=</nowiki></code> <code><nowiki>&&=</nowiki></code> <code><nowiki>||=</nowiki></code>
|Справа налево
|-
|20
|<code><nowiki>,</nowiki></code> <code><nowiki>=></nowiki></code>
|Слева направо
|-
|21
|Правосторонние списковые операции
|Не сочетаются
|-
|22
|<code><nowiki>not</nowiki></code>
|Справа налево
|-
|23
|<code><nowiki>and</nowiki></code>
|Слева направо
|-
|24
|<code><nowiki>or</nowiki></code> <code><nowiki>xor</nowiki></code>
|Слева направо
|}
* В данной таблице чем выше приоритет операции и чем левее она стоит (в большинстве случаев), тем раньше она выполняется.
* Приоритет списковой операции зависит от ее места в выражении и может изменяться от наивысшего к наименьшему. Все операции в выражении, стоящие слева от списковой, имеют наивысший приоритет по отношению к ней (смотрите 21 приоритет).
* Свойство сочетаемости означает, что операции одного приоритета могут быть в одном выражении, причем порядок их разрешения может быть слева направо или справа налево.
* Скобки позволяют изменить порядок вычисления, определяемому в обычных условиях приоритетом и сочетаемостью. Скобки всегда наделяют выражение в них наивысшим приоритетом.
== Примечания ==
{{примечания}}
hcnsdjjennrvha3baa0b7p870nd6ksx
Некоторые сведения о Perl 5/Ссылки
0
30398
270330
270047
2026-10-09T19:52:47Z
ScriptMaster
15708
/* Вычисленный вызов функции */
270330
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>
=== Сквозные ссылки ===
== Примечания ==
{{примечания}}
gd4nbikbklvlzpgib7k39g81h3k3xrt
270331
270330
2026-10-09T21:18:35Z
ScriptMaster
15708
/* Сквозные ссылки */
270331
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>
=== Сквозные ссылки ===
''Сквозными'' называются такие ссылки, которые передаются в стеке вызовов без лишнего копирования и переименовывания по пути. Это способ передачи данных между процедурами является самым правильным, когда структура, на которую отсылает ссылка, является сложной, тяжёлой и, возможно, данные в ней нужно редактировать на месте.
Когда вы передаете ссылку в глубину через несколько процедур, просто передавайте скаляр на неё, используя псевдонимы из массива <code>@_</code>.
<source lang="perl">
sub procedure_1 {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2 {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3 {
push @{$_[0]}, 'procedure_3';
}
my $ref = [];
procedure_1($ref);
print "$_\n" foreach @$ref;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно написать тот же код с прототипами.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
}
my @array;
procedure_1(@array);
print "$_\n" foreach @array;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно пойти дальше и заставить каждую процедуру возвращать ссылку так, чтобы одна и та же структура путешествовала бы в стеке вызовов в обе стороны. Ниже показан пример на анонимном массиве только для демонстрации того, что ссылка прошла в обе стороны.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
return procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
return procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
return $_[0];
}
print "$_\n" for @{procedure_1( @{[]} )};
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Ссылка не обязательно должна конструироваться на стороне клиентского кода: её можно конструировать в теле цепочки вызовов.
<source lang="perl">
sub procedure_1 {
my $data = procedure_2();
push @$data, "procedure_1";
return $data;
}
sub procedure_2 {
my $data = procedure_3();
push @$data, "procedure_2";
return $data;
}
sub procedure_3 {
my $data = ['procedure_3'];
return $data;
}
print "$_\n" for @{ procedure_1() };
</source>
<pre>
procedure_3
procedure_2
procedure_1
</pre>
Не нужно бояться конструировать ссылку в теле процедуры. Если ссылка возвращается из процедуры, интерпретатор не будет понижать счетчик использования ссылки в момент выхода из неё, как можно было бы подумать.
<source lang="perl">
sub procedure {
my %data = ( data => "some string" );
return \%data;
# Можно было бы подумать, что сконструированная ссылка будет удалена
# в момент выхода из процедуры, но нет. Интерпретатор прекрасно видит,
# что она используется снаружи.
}
use Data::Dumper;
print Dumper &procedure;
$ref = &procedure; # Здесь владение ссылкой передается переменной $main::ref.
print Dumper $ref;
</source>
<pre>
$VAR1 = {
'data' => 'some string'
};
$VAR1 = {
'data' => 'some string'
};
</pre>
Если ссылка не может быть сконструирована по логике программы по каким-то причинам, обычно следует возвращать из процедуры <code>undef</code>, а не пустую ссылку. Но если вы конструируете массивы или хэши, то возврат пустой ссылки является приемлемым решением, потому что обычно клиентский код не проверяет, что в ссылке на самом деле вернулось. Если и этот вариант не подходит, то следует выбросить исключение.
<source lang="perl">
# Пример с возвратом undef.
use feature 'say';
# Возвращает из базы данных данные профиля по идентификатору.
sub get_user_data {
my $id = shift;
if ($id != 42) { return undef; } # Пользователь не найден
return { name => 'Larry', role => 'admin' };
}
# Принимает на вход идентификатор и выгружает данные профиля из базы.
sub process_profile {
my $id = shift;
my $user = get_user_data($id) // {};
return $user->{role};
}
say process_profile(42); # admin
say process_profile(99); # В этом случае вернется undef, но программа не упадет.
</source>
<source lang="perl">
# Пример с возвратом ссылки на пустой массив.
use feature 'say';
sub AUTOLOAD {
undef
}
sub find_orders_by_date {
my $date = shift;
my @orders = db_select($date); # В этом месте будет вызвана AUTOLOAD.
if (!@orders) {
return [];
}
# До сюда мы никогда не доберемся.
return \@orders;
}
# В этом примере всегда будет возвращаться ссылка на пустой массив.
my $orders_ref = find_orders_by_date('2026-10-09');
# Цикл просто не выполнится, если заказов нет, но код НЕ упадет!
foreach my $order (@$orders_ref) {
say $order->{id};
}
</source>
Если <code>undef</code> и пустые ссылки — штатная ситуация, — то выброшенное исключение обычно говорит о нарушении API-контракта со стороны клиентского кода. Ниже показан типичный случай с использованием модуля <code>Carp</code>.
<source lang="perl">
use Carp qw(croak);
sub internal_parser {
my ($config_ref) = @_;
# Проверяем сквозную ссылку
if (!defined $config_ref) {
# Сработает как die, но покажет строку в основном скрипте,
# где вызвали эту функцию с плохими параметрами!
croak "Configuration is not defined.";
}
return $config_ref->{db_name};
}
# --- Основной скрипт ---
my $config = undef; # Забыли прочитать файл
# Ошибка укажет на ЭТУ (20) строку, а не на строку 10 внутри функции internal_parser
my $db = internal_parser($config);
</source>
<pre>
Configuration is not defined. at .\a.pl line 7.
main::internal_parser(undef) called at .\a.pl line 19
</pre>
== Примечания ==
{{примечания}}
nmnf3z5r66oj1eq3jjo3y5ipn0bx6vx
270332
270331
2026-10-09T21:25:58Z
ScriptMaster
15708
/* Сквозные ссылки */
270332
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>
=== Сквозные ссылки ===
''Сквозными'' называются такие ссылки, которые передаются в стеке вызовов без лишнего копирования и переименовывания по пути. Это способ передачи данных между процедурами является самым правильным, когда структура, на которую отсылает ссылка, является сложной, тяжёлой и, возможно, данные в ней нужно редактировать на месте.
Когда вы передаете ссылку в глубину через несколько процедур, просто передавайте скаляр на неё, используя псевдонимы из массива <code>@_</code>.
<source lang="perl">
sub procedure_1 {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2 {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3 {
push @{$_[0]}, 'procedure_3';
}
my $ref = [];
procedure_1($ref);
print "$_\n" foreach @$ref;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно написать тот же код с прототипами.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
}
my @array;
procedure_1(@array);
print "$_\n" foreach @array;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно пойти дальше и заставить каждую процедуру возвращать ссылку так, чтобы одна и та же структура путешествовала бы в стеке вызовов в обе стороны. Ниже показан пример на анонимном массиве только для демонстрации того, что ссылка прошла в обе стороны.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
return procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
return procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
return $_[0];
}
print "$_\n" for @{procedure_1( @{[]} )};
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Ссылка не обязательно должна конструироваться на стороне клиентского кода: её можно конструировать в теле цепочки вызовов.
<source lang="perl">
sub procedure_1 {
my $data = procedure_2();
push @$data, "procedure_1";
return $data;
}
sub procedure_2 {
my $data = procedure_3();
push @$data, "procedure_2";
return $data;
}
sub procedure_3 {
my $data = ['procedure_3'];
return $data;
}
print "$_\n" for @{ procedure_1() };
</source>
<pre>
procedure_3
procedure_2
procedure_1
</pre>
Не нужно бояться конструировать ссылку в теле процедуры. Если ссылка возвращается из процедуры, интерпретатор не будет понижать счетчик использования ссылки в момент выхода из неё, как можно было бы подумать.
<source lang="perl">
sub procedure {
my %data = ( data => "some string" );
return \%data;
# Можно было бы подумать, что сконструированная ссылка будет удалена
# в момент выхода из процедуры, но нет. Интерпретатор прекрасно видит,
# что она используется снаружи.
}
use Data::Dumper;
print Dumper &procedure;
$ref = &procedure; # Здесь владение ссылкой передается переменной $main::ref.
print Dumper $ref;
</source>
<pre>
$VAR1 = {
'data' => 'some string'
};
$VAR1 = {
'data' => 'some string'
};
</pre>
Если ссылка не может быть сконструирована по логике программы по каким-то причинам, обычно следует возвращать из процедуры <code>undef</code>, а не пустую ссылку. Но если вы конструируете массивы или хэши, то возврат пустой ссылки является приемлемым решением, потому что обычно клиентский код не проверяет, что в ссылке на самом деле вернулось. Если и этот вариант не подходит, то следует выбросить исключение.
<source lang="perl">
# Пример с возвратом undef.
use feature 'say';
# Возвращает из базы данных данные профиля по идентификатору.
sub get_user_data {
my $id = shift;
if ($id != 42) { return undef; } # Пользователь не найден
return { name => 'Larry', role => 'admin' };
}
# Принимает на вход идентификатор и выгружает данные профиля из базы.
sub process_profile {
my $id = shift;
my $user = get_user_data($id) // {};
return $user->{role};
}
say process_profile(42); # admin
say process_profile(99); # В этом случае вернется undef, но программа не упадет.
</source>
<source lang="perl">
# Пример с возвратом ссылки на пустой массив.
use feature 'say';
sub AUTOLOAD {
undef
}
sub find_orders_by_date {
my $date = shift;
my @orders = db_select($date); # В этом месте будет вызвана AUTOLOAD.
if (!@orders) {
return [];
}
# До сюда мы никогда не доберемся.
return \@orders;
}
# В этом примере всегда будет возвращаться ссылка на пустой массив.
my $orders_ref = find_orders_by_date('2026-10-09');
# Цикл просто не выполнится, если заказов нет, но код НЕ упадет!
foreach my $order (@$orders_ref) {
say $order->{id};
}
</source>
Если <code>undef</code> и пустые ссылки — штатная ситуация, — то выброшенное исключение обычно говорит о нарушении API-контракта со стороны клиентского кода. Ниже показан типичный случай с использованием модуля <code>Carp</code>.
<source lang="perl">
use Carp qw(croak);
sub internal_parser {
my ($config_ref) = @_;
# Проверяем сквозную ссылку
if (!defined $config_ref) {
# Сработает как die, но покажет строку в основном скрипте,
# где вызвали эту функцию с плохими параметрами!
croak "Configuration is not defined.";
}
return $config_ref->{db_name};
}
# --- Основной скрипт ---
my $config = undef; # Забыли прочитать файл
# Ошибка укажет на ЭТУ строку, а не на строку 10 внутри функции internal_parser
my $db = internal_parser($config);
</source>
<pre>
Configuration is not defined. at .\a.pl line 7.
main::internal_parser(undef) called at .\a.pl line 19
</pre>
== Примечания ==
{{примечания}}
s7yx9shqsjgtj6zygcoft81qegrlxl9
270333
270332
2026-10-09T21:26:32Z
ScriptMaster
15708
/* Сквозные ссылки */
270333
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>
=== Сквозные ссылки ===
''Сквозными'' называются такие ссылки, которые передаются в стеке вызовов без лишнего копирования и переименовывания по пути. Это способ передачи данных между процедурами является самым правильным, когда структура, на которую отсылает ссылка, является сложной, тяжёлой и, возможно, данные в ней нужно редактировать на месте.
Когда вы передаете ссылку в глубину через несколько процедур, просто передавайте скаляр на неё, используя псевдонимы из массива <code>@_</code>.
<source lang="perl">
sub procedure_1 {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2 {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3 {
push @{$_[0]}, 'procedure_3';
}
my $ref = [];
procedure_1($ref);
print "$_\n" foreach @$ref;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно написать тот же код с прототипами.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
}
my @array;
procedure_1(@array);
print "$_\n" foreach @array;
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Можно пойти дальше и заставить каждую процедуру возвращать ссылку так, чтобы одна и та же структура путешествовала бы в стеке вызовов в обе стороны. Ниже показан пример на анонимном массиве только для демонстрации того, что ссылка прошла в обе стороны.
<source lang="perl">
sub procedure_1(\@) {
my ($data) = @_; # Используем псевдоним
push @$data, 'procedure_1';
return procedure_2($data);
}
sub procedure_2(\@) {
# Или работаем с @_ на месте.
push @{$_[0]}, 'procedure_2';
return procedure_3($_[0]);
}
sub procedure_3(\@) {
push @{$_[0]}, 'procedure_3';
return $_[0];
}
print "$_\n" for @{procedure_1( @{[]} )};
</source>
<pre>
procedure_1
procedure_2
procedure_3
</pre>
Ссылка не обязательно должна конструироваться на стороне клиентского кода: её можно конструировать в теле цепочки вызовов.
<source lang="perl">
sub procedure_1 {
my $data = procedure_2();
push @$data, "procedure_1";
return $data;
}
sub procedure_2 {
my $data = procedure_3();
push @$data, "procedure_2";
return $data;
}
sub procedure_3 {
my $data = ['procedure_3'];
return $data;
}
print "$_\n" for @{ procedure_1() };
</source>
<pre>
procedure_3
procedure_2
procedure_1
</pre>
Не нужно бояться конструировать ссылку в теле процедуры. Если ссылка возвращается из процедуры, интерпретатор не будет понижать счетчик использования ссылки в момент выхода из неё, как можно было бы подумать.
<source lang="perl">
sub procedure {
my %data = ( data => "some string" );
return \%data;
# Можно было бы подумать, что сконструированная ссылка будет удалена
# в момент выхода из процедуры, но нет. Интерпретатор прекрасно видит,
# что она используется снаружи.
}
use Data::Dumper;
print Dumper &procedure;
$ref = &procedure; # Здесь владение ссылкой передается переменной $main::ref.
print Dumper $ref;
</source>
<pre>
$VAR1 = {
'data' => 'some string'
};
$VAR1 = {
'data' => 'some string'
};
</pre>
Если ссылка не может быть сконструирована по логике программы по каким-то причинам, обычно следует возвращать из процедуры <code>undef</code>, а не пустую ссылку. Но если вы конструируете массивы или хэши, то возврат пустой ссылки является приемлемым решением, потому что обычно клиентский код не проверяет, что в ссылке на самом деле вернулось. Если и этот вариант не подходит, то следует выбросить исключение.
<source lang="perl">
# Пример с возвратом undef.
use feature 'say';
# Возвращает из базы данных данные профиля по идентификатору.
sub get_user_data {
my $id = shift;
if ($id != 42) { return undef; } # Пользователь не найден
return { name => 'Larry', role => 'admin' };
}
# Принимает на вход идентификатор и выгружает данные профиля из базы.
sub process_profile {
my $id = shift;
my $user = get_user_data($id) // {};
return $user->{role};
}
say process_profile(42); # admin
say process_profile(99); # В этом случае вернется undef, но программа не упадет.
</source>
<source lang="perl">
# Пример с возвратом ссылки на пустой массив.
use feature 'say';
sub AUTOLOAD {
undef
}
sub find_orders_by_date {
my $date = shift;
my @orders = db_select($date); # В этом месте будет вызвана AUTOLOAD.
if (!@orders) {
return [];
}
# До сюда мы никогда не доберемся.
return \@orders;
}
# В этом примере всегда будет возвращаться ссылка на пустой массив.
my $orders_ref = find_orders_by_date('2026-10-09');
# Цикл просто не выполнится, если заказов нет, но код НЕ упадет!
foreach my $order (@$orders_ref) {
say $order->{id};
}
</source>
Если <code>undef</code> и пустые ссылки — штатная ситуация, — то выброшенное исключение обычно говорит о нарушении API-контракта со стороны клиентского кода. Ниже показан типичный случай с использованием модуля <code>Carp</code>.
<source lang="perl">
use Carp qw(croak);
sub internal_parser {
my ($config_ref) = @_;
# Проверяем сквозную ссылку
if (!defined $config_ref) {
# Сработает как die, но покажет строку в основном скрипте,
# где вызвали эту функцию с плохими параметрами!
croak "Configuration is not defined.";
}
return $config_ref->{db_name};
}
# --- Основной скрипт ---
my $config = undef; # Забыли прочитать файл
# Ошибка укажет на ЭТУ строку, а не на строку внутри функции internal_parser
my $db = internal_parser($config);
</source>
<pre>
Configuration is not defined. at .\a.pl line 7.
main::internal_parser(undef) called at .\a.pl line 19
</pre>
== Примечания ==
{{примечания}}
2hl307u2c30wka2ukkj72pg1jch20kk
Рецепт:Наси-горенг
104
35163
270324
270209
2026-10-09T14:01:06Z
Heffalump1974
37550
шаблон
270324
wikitext
text/x-wiki
{{Рецепт
| Изображение = Nasi_Goreng-Lombok.JPG
| Порций =
| Время =
| Сложность =
| Энергетическая ценность =
}}
'''На́си-горе́нг''' (инд. nasi goreng) — блюдо ряда национальных кухонь Юго-Восточной Азии, жареный рис с мясом или овощами. Для приготовления используется варёный рис.
Существует во множестве региональных и национальных вариантов.
== Наси-горенг 1<ref name="gol92" /> ==
=== Состав ===
(на 4 порции)
* рис: 750 г
* лук(?): 8 шт(?)
* чеснок: 2 дольки
* красный перец: 3 шт
* мясо: 250 г (предварительно обжаренное, нарезанное тонкими кусками)
* креветки: 50 г (отваренные)
* порошок из панцирей креветок
* лук-порей: 2-3 стебля
* яйцо: 1 шт
* длинноплодный огурец
* растительное масло
=== Приготовление ===
# Отварить рис и дать остыть.
# Часть луковиц отложить для обжаривания, остальные растереть с чесноком, панцирями креветок и солью; обжарить смесь в растительном масле
# Обжарить мясо, креветки и измельчённый лук-порей.
# Перемешать всё с остывшим рисом и обжаривать ещё несколько минут. Отдельно поджарить яичницу-глазунью и измельчённый лук.
# Готовое блюдо положить на подогретую тарелку, сверху положить яичницу и посыпать жареным луком; на гарнир — крупные куски очищенного огурца. Подавать горячим.
== См. также ==
* [[Рецепт:Жареный рис|жареный рис]] (炒飯, 炒饭, chǎofàn)
* [[Рецепт:Ризотто|ризотто]]
* [[Рецепт:Паэлья|паэлья]]
* [[Рецепт:Плов|плов]]
* [[Рецепт:Джамбалайя|джамбалайя]] (jambalaya)
== Примечания ==
{{примечания|refs=
<ref name="gol92">{{Книга
|ответственный= Йоханна Элизабет Ритсема-Пасман
|заглавие = Голландская кухня
|часть = Наси Горенг
|место = Москва
|издательство = Карвет
|год = 1992
|страницы = 67
|страниц = 128
}}</ref>
}}
== Ссылки ==
* {{Youtube|SG6itbjUCuA|Nasi Goreng (Indonesian Fried Rice)|logo=1}}{{ref-en}}
* {{Youtube|5WkPLT7CiBs|Nasi Goreng zoals bij de Chinees 🍚🍳 / (Dutch) Chinese restaurant egg fried rice 🍚🍳荷兰中印餐馆炒饭|logo=1}}{{ref-nl}}
* {{Youtube|V8xOJVq43As|RESEP NASI GORENG JAWA ENAK BUANGETTTTTT|logo=1}}{{ref-id}}
* [https://eda.ru/recepty/osnovnye-blyuda/nasi-goreng-124891 eda.ru Индонезийский жареный рис наси-горенг (фото и видео)]{{ref-ru}}
{{Индонезийская кухня}}
{{Сингапурская кухня}}
b9fz9edmq3s83ak3kf31vlx8es27phk
Рецепт:Кетопрак
104
35166
270329
263228
2026-10-09T14:06:49Z
Heffalump1974
37550
шаблон
270329
wikitext
text/x-wiki
{{Рецепт
|Изображение = Ketoprak Boplo.JPG
|Категория = Салаты
|Кухня = Индонезийская кухня
|Порций =
|Время =
|Сложность =
|Энергетическая ценность =
|Ингредиенты =
}}
'''Кетопра́к''' (индонез. ''ketoprak'') — индонезийское подобие салата из риса, тофу, лапши, овощей и др. продуктов под [[Рецепт:Соус Арахисовый|арахисовым соусом]]. Существуют различные варианты рецепта.
== Кетопрак 1 ==
(перевод с min-wikibooks)
=== Состав ===
* отварной рис в брикетах [[w:Лонтонг|лонтонг]] (или [[w:Кетупат|кетупат]]): 3 шт
* китайский белый тофу: 1 шт
* огурец: 1 шт
* рисовая вермишель: 1 упаковка
* [[Рецепт:Соус арахисовый|арахисовый соус]]
* острый перец: по вкусу
* чеснок
* ростки сои
* [[Рецепт:Соус Соевый|соевый соус]] (сладкий)
* соль: по вкусу
* [[Рецепт:Яйца вкрутую|яйца отварные]]
=== Приготовление ===
# Огурец нарезать мелкими кубиками, а очищенный от упаковки рис — кусочками предпочитаемого размера.
# Тофу обжарить до золотисто-коричневого цвета, извлечь, дать стечь жидкости.
# Замочить вермишель и ростки в горячей воде (кипятке) на 10 минут.
# Измельчить перец и чеснок в тарелке, затем добавить [[Рецепт:Соус Арахисовый|арахисовый соус]] и перемешать до однородной консистенции.
# Затем добавьте рис, тофу, ростки, огурец и вермишель; количество — по вкусу, хорошо перемешать.
# По желанию полить [[Рецепт:Соус Соевый|соевым соусом]], добавить [[Рецепт:Яйца вкрутую|отварные яйца]] (нарезаные половинками или четвертинками).
Чтобы кетопрак был более плотным, перед подачей можно добавить крекеры [[w:Крупук|крупук]].
== См. также ==
* [[Рецепт:Гадо-гадо|гадо-гадо]] — смесь нарезанных овощей под арахисовым соусом
== Ссылки ==
* {{Youtube|iBMAWbLykB0|RESEP KETOPRAK ENAK DAN SIMPLE|logo=1}}{{ref-id}}
{{Индонезийская кухня}}
a965uxeaikp6es53pseeaf6l7d394dz
Рецепт:Соус Арахисовый
104
35174
270328
263264
2026-10-09T14:06:28Z
Heffalump1974
37550
шаблон
270328
wikitext
text/x-wiki
{{Рецепт
|Изображение = Pecel Solo.JPG
|Категория = Соусы
|Кухня = Индонезийская кухня, Малайзийская кухня, Вьетнамская кухня, Филиппинская кухня, Тайская кухня, Китайская кухня, Сингапурская кухня, Нидерландская кухня
|Порций =
|Время =
|Сложность =
|Энергетическая ценность =
|Ингредиенты = Арахис
}}
[[File:Sos Kacang (dengan bumbu dan chili).jpg|right|thumb|Более густой вариант соуса]]
'''Арахисовый соус''' (нед. ''pindasauce'' / ''satésaus'', индонез., малайз. ''bumbu kacang'', кит. ''沙嗲醬'') — приправа ряда кухонь Юго-Восточной Азии, существует во множестве вариантов.
== Соус Арахисовый 1<ref name="gol92" /> ==
(фрагмент рецепта [[Рецепт:Гадо-гадо|гадо-гадо]])
=== Состав ===
* арахис: 1 чайное блюдце
* тамаринд или лимонный сок
* сахар-песок: 2 ч. л.
* немного измельчённых панцирей креветок
* кокосовое молоко: 1 чашка
* лист лимона: 1 шт
* растительное масло
=== Приготовление ===
# Растереть арахис с сахаром, лимонным соком и панцирями креветок.
# Обжарить смесь в масле.
# Добавить лист лимона и кокосовое молоко (можно заменить кокосовой мукой, проваренной 5 минут в воде).
# Процедить всё через дуршлаг.
== Соус Арахисовый 2 ==
(фрагмент рецепта [[Рецепт:Гадо-гадо|гадо-гадо]] из en-wikibooks)
=== Состав ===
* ''тераси'' (ферментированная креветочная паста): 1 г
* растительное масло
* арахис: 300 г
* перец чили (свежий или сушёный)
* чеснок: 1 зубчик
* соль
* ''гула ява'' (индонезийский пальмовый сахар): 125 г
* лук-шалот: 4 шт
* сахар
* свежевыжатый сок лайма или рисовый уксус
=== Приготовление ===
# Обжарить креветочную пасту на растительном масле до появления аромата.
# Обжарить арахис до золотисто-коричневого цвета. Вынуть его из сковороды и оставить остывать, затем слить лишнее масло.
# Измельчить арахис в пасту.
# Добавить к арахисовой пасте молотый перец чили, чеснок, соль, сахар и креветочную пасту. Измельчить до однородной массы.
# Положить арахисовую пасту в кастрюлю, добавить немного воды (для более насыщенного вкуса использовать кокосовое молоко).
# Добавить в арахисовый соус сахар по вкусу и довести до кипения.
# Тушить арахисовый соус на малом огне до загустения, приправив соком лайма или уксусом.
== Соус Арахисовый 3 ==
(перевод с nl-wikibooks)
=== Состав ===
* растительное масло: 1 ст. л
* лук-шалот: 1-2 шт или 1 средняя луковица
* самбал: 1-2 ч. л.
* чеснок: 2 зубчика
* сахар: 1 ч. л. или 2 столовые ложки (мангового) чатни
* имбирь: 1 ч. л. имбирного порошка или тёртого свежего имбиря
* лимонный сок: 1 ст. л.
* кетчуп: 2 ст. л.
* арахисовое масло несолёное натуральное арахисового масла: 2-3 ст. л.
Возможные дополнительные ингредиенты:
* семена тмина: 1 ч. л. (''джинтен'')
* семена кориандра: 1 ч. (''кетумбар'')
* немного пива
* соль
=== Оборудование ===
Кастрюля или сотейник
==== Приготовление (вариант 1) ====
# Измельчить лук-шалот.
# Разогреть масло и слегка обжарить самбал и мелко нарезанный или раздавленный чеснок, затем обжарить лук-шалот.
# Добавить 1 ст. л. сахара (без горки) и 1 ч. л. лимонного сока.
# Когда шалот полностью приготовится, добавить щедрую порцию кетчупа.
# Растопить в соусе столовую ложку с горкой арахисового масла, а затем добавить (теплую) воду, чтобы загустить соус до желаемой консистенции.
==== Приготовление (вариант 2) ====
# Мелко нарезать лук-шалот или репчатый лук (на небольшие кусочки).
# Разогреть масло и слегка обжаить самбал и мелко нарезанный или раздавленный чеснок, затем обжарить лук-шалот.
# Добавить специи (имбирь, тмин и/или кориандр). Продолжать обжаривать.
# Добавить арахисовое масло и размешать его с водой (примерно 0,1 л) до желаемой консистенции. Довести до кипения и выключить огонь.
# Приправить соус чатни, кетчупом и лимонным соком.
==== Приготовление (вариант 3) ====
# Варить, постоянно помешивая, половину мясного бульона на малом огне, постепенно добавляя арахисовое масло, пока не образуется однородная смесь.
# Добавить оставшийся бульон и лимонный сок.
# Добавить кетчуп, самбал, травы и специи по вкусу.
# Если соус слишком густой, добавить ещё бульона. Если слишком жидкий, добавить ещё арахисовой пасты. Мясной бульон можно заменить кокосовым молоком или водой.
=== Комментарии, советы и вариации ===
* Вместо шалота можно использовать обычный нарезанный лук.
* Натуральный лимонный сок можно заменить разбавив концентрированный (который можно хранить в холодильнике, как и измельчённый чеснок). Также можно использовать тёртую лимонную цедру.
* Если соус предназначен для маленьких детей, самбал рекомендуется использовать в небольших количествах — или не использовать его вообще.
* Очень сладкий арахисовый соус нравится не всем; в таком случае сахар можно не добавлять: кетчуп даст достаточную сладость.
== См. также ==
* [[Рецепт:Кетопрак|кетопрак]] — индонезийский салат с арахисовым соусом
* [[Рецепт:Гадо-гадо|гадо-гадо]] — смесь нарезанных овощей под арахисовым соусом
== Примечания ==
{{примечания|refs=
<ref name="gol92">{{Книга
|ответственный= Йоханна Элизабет Ритсема-Пасман
|заглавие = Голландская кухня
|часть = Гадо Гадо
|место = Москва
|издательство = Карвет
|год = 1992
|страницы = 71-72
|страниц = 128
}}</ref>
}}
== Ссылки ==
* {{Youtube|5nBXV9cu-vU|Rahsia Kuah Kacang Mak yang paling sedap . Peanut Sauce Recipe|logo=1}}{{ref-en}}{{ref-ms}}
{{Индонезийская кухня}}
jml01rdmkfuckcfkt1h7q3q9pzsww2x
Рецепт:Ачар
104
35176
270326
270271
2026-10-09T14:01:50Z
Heffalump1974
37550
шаблон
270326
wikitext
text/x-wiki
{{Рецепт
|Изображение = Acar mentimun.jpg
|Категория =
|Кухня = Индонезийская кухня, Малайзийская кухня, Индийская кухня, Тайская кухня, Сингапурская кухня, Брунейская кухня, Нидерландская кухня
|Порций =
|Время =
|Сложность =
|Энергетическая ценность =
|Ингредиенты =
}}
'''Ачар''' (нид. ''atjar'', индонез., малайз. ''acar'') — приправа ряда кухонь Юго-Восточной Азии из маринованных овощей и других ингредиентов, существует во множестве вариантов.
Может использоваться также как соус для тушения. Словом «ачар» в таком случае может называться и полученное блюдо.
== Ачар 1 ==
(перевод из nl-wikibooks)
;atjar tjampoer — маринованная овощная смесь
=== Состав ===
* капуста белокочанная (или острокочанная): 200 г
* морковь: 50 г
* лук-шалот: 1 шт
* тёплая вода: 100 мл
* поваренная соль: 1 щепотка
* белый уксус: 100 мл
* куркума 2 ч. л.
* перец молотый: 1 щепотка
* молотый имбирь: 1 ч. л. (''джахе'')
* молотый галангала: 1 ч. л.
* сахар: 1 ст. л.
=== Оборудование ===
1-2 стеклянные банки с крышками (из-под варенья или иных консервов), недавно простерилизованные.
=== Приготовление ===
# Вымыть и очистить овощи, нарезать капусту и морковь нарезать соломкой, лук-шалот – измельчить.
# Поместить остальные ингредиенты (кроме овощей) в кастрюлю. Кипятить жидкость до растворения сахара.
# Добавить овощи, довестит жидкость до кипения и варить на малом огне 1 минуту. Затем сразу же снять кастрюлю с огня. Овощи должны остаться хрустящими.
# Разложить овощи и жидкость по банкам. Закрыть банки крышками, перевернуть их вверх дном на кухонном полотенце и дать остыть (это создаст вакуумную изоляцию).
# Затем поставить в холодильник минимум на 2 часа, чтобы ароматы смешались.
=== Варианты ===
* Возможные добавки: болгарский перец, огурец (удалить семена), соцветия цветной капусты, цуккини. Ароматизатор: красный перец
=== Хранение ===
Закрытые банки хранятся в холодильнике несколько недель, вскрытые в пределах 1 недели.
== Ссылки ==
* {{Youtube|_1d4a047Jqo|Maak zelf Atjar Tjampoer. Lekker bij de Indonesische rijsttafel.|logo=1}}{{ref-nl}}
{{Индийская кухня}}
{{Индонезийская кухня}}
48ioredswcn60gn9jvjvdopzgdyqnky
Рецепт:Гадо-гадо
104
35179
270325
263258
2026-10-09T14:01:33Z
Heffalump1974
37550
шаблон
270325
wikitext
text/x-wiki
{{Рецепт
|Изображение = Gado gado Ny Suharti Bandung.JPG
|Категория = Салаты
|Кухня = Индонезийская кухня, Малайзийская кухня, Сингапурская кухня, Нидерландская кухня
|Порций =
|Время =
|Сложность =
|Энергетическая ценность =
|Ингредиенты =
}}
'''Гадо́-гадо́''' (индонез. gado-gado) — индонезийское блюдо по типу салата из смеси овощей и других продуктов, как варёных, так и сырых, под [[Рецепт:Соус Арахисовый|арахисовым соусом]]. Существует во множестве вариантов. Может подаваться как самостоятельное блюдо и как гарнир.
== Гадо-гадо 1<ref name="gol92" /> ==
=== Состав ===
* капуста (зелёная, белокачанная, брюссельская или цветная)
* эндивий
* молодая фасоль
* морковь
* проросшие зёрна маша
* [[Рецепт:Соус Арахисовый|арахисовый соус]]
=== Приготовление ===
# Овощи (кроме зёрен маша) вымыть, очистить, мелко нарезать. Более твёрдые (или по желанию все) отварить обычным способом или на пару
# Заранее приготовить [[Рецепт:Соус Арахисовый|арахисовый соус]]
# Положить овощи на тарелку и полить их соусом.
# На гарнир подать тонко нарезанное [[Рецепт:Яйца вкрутую|крутое яйцо]], кубики холодного [[Рецепт:Картофель отварной|отварного картофеля]], поджаренные луковицы.
По желанию блюдо можно подать с рисом.
== Гадо-гадо 2 ==
(перевод с nl-wikibooks)
=== Состав ===
* стручковая зелёная фасоль: 300 г
* острокочанная капуста: 400 г
* ростки фасоли: 200 г
* яйца: 4 шт
* [[Рецепт:Соус Арахисовый|арахисовый соус]]: 0,5 л
* рис: 350 г
* креветочные чипсы [[Рецепт:Крупук|крупук]]: 1 пакет
==== Приготовление ====
# Очистить овощи. Нарезать стручковую фасоль крупными кусками (на 2 или 3 части, в зависимости от размера). Очистить кочанную капусту. Отварить оба овоща отдельно до готовности. Не переваривать кочанную капусту; она должна остаться немного хрустящей.
# Отварить рис.
# Отварить [[Рецепт:Яйца вкрутую|яйца вкрутую]] (10 минут). Затем разрезать их пополам или нарежьте ломтиками.
# Приготовить [[Рецепт:Соус Арахисовый|арахисовый соус]] или использовать готовый.
# Бланшировать ростки фасоли 1-2 минуты в воде, в которой варилась стручковая фасоль.
# Крупук измельчить до крупных кусочков.
Подавать гадо-гадо на больших плоских тарелках, с рисом, стручковой фасолью, кочанной капустой и ростками фасоли на дне. Рядом с каждой тарелкой положить яйца. Полить их [[Рецепт:Соус Арахисовый|арахисовым соусом]] и отдельно подать крупук.
== Примечания ==
{{примечания|refs=
<ref name="gol92">{{Книга
|ответственный= Йоханна Элизабет Ритсема-Пасман
|заглавие = Голландская кухня
|часть = Гадо Гадо
|место = Москва
|издательство = Карвет
|год = 1992
|страницы = 71
|страниц = 128
}}</ref>
}}
== См. также ==
* [[Рецепт:Кетопрак|кетопрак]] — индонезийский салат с арахисовым соусом
== Ссылки ==
* {{Youtube|KooUC7vMjAU|Салат гадо гадо. Пошаговый рецепт приготовления индонезийского овощного салата гадо гадо.|logo=1}}{{ref-ru}}
* [https://eda.ru/recepty/salaty/gado-gado-114400 Индонезийский салат гадо-гадо]{{ref-ru}}
{{Индонезийская кухня}}
m8kb75vsp0okj8nwabrmwv7q56wpymr
Шаблон:Индонезийская кухня
10
35901
270323
2026-10-09T13:59:28Z
Heffalump1974
37550
Новая страница: «{{Навигационная таблица | name = Индонезийская кухня | title = [[Индонезийская кухня]] | state = <includeonly>{{{state|autocollapse}}}</includeonly> | bodyclass = hlist | group1 = Блюда из риса (Наси) | list1 = [[Рецепт:Наси-горенг|Наси-горенг (жареный рис)]] • Рецепт:Наси-кунинг|Наси-кунинг (жёлт...»
270323
wikitext
text/x-wiki
{{Навигационная таблица
| name = Индонезийская кухня
| title = [[Индонезийская кухня]]
| state = <includeonly>{{{state|autocollapse}}}</includeonly>
| bodyclass = hlist
| group1 = Блюда из риса (Наси)
| list1 = [[Рецепт:Наси-горенг|Наси-горенг (жареный рис)]] • [[Рецепт:Наси-кунинг|Наси-кунинг (жёлтый рис)]] • [[Рецепт:Наси-удук|Наси-удук]] • [[Рецепт:Лонтонг|Лонтонг (прессованный рис)]] • Кетупат
| group2 = Блюда из лапши (Ми)
| list2 = [[Рецепт:Ми-горенг|Ми-горенг (жареная лапша)]] • [[Рецепт:Ми-аям|Ми-аям]] • [[Рецепт:Бакми|Бакми]]
| group3 = Супы и жидкие блюда
| list3 = [[Рецепт:Сото|Сото (индонезийский суп)]] • [[Рецепт:Баксо|Баксо (суп с фрикадельками)]] • [[Рецепт:Саюр-асем|Саюр-асем]] • [[Рецепт:Суп-бунтут|Суп-бунтут (из бычьих хвостов)]]
| group4 = Мясные и основные блюда
| list4 = [[Рецепт:Сатай|Сатай (шашлычки сатэ)]] • [[Рецепт:Ренданг|Ренданг]] • [[Рецепт:Аям-горенг|Аям-горенг (жареная курица)]] • [[Рецепт:Баби-гулинг|Баби-гулинг]] • [[Рецепт:Опор-аям|Опор-аям]]
| group5 = Салаты, закуски и соусы
| list5 = [[Рецепт:Гадо-гадо|Гадо-гадо]] • [[Рецепт:Крупук|Крупук (чипсы)]] • [[Рецепт:Песель|Песель]] • [[Рецепт:Самбал|Самбал (острый соус)]] • [[Рецепт:Ачар|Ачар (маринованные овощи)]] • [[Рецепт:Темпе|Темпе]]
| group6 = Сладости и напитки
| list6 = [[Рецепт:Писанг-горенг|Писанг-горенг (жареные бананы)]] • [[Рецепт:Клепон|Клепон]] • [[Рецепт:Колак|Колак]] • [[Рецепт:Эс-телер|Эс-телер (кокосовый коктейль)]] • [[Рецепт:Копи-лувак|Кофе лувак]] • Чендол
| belowstyle = font-weight:bold;
| below = Категория «Индонезийская кухня»: '''[[:Категория:Индонезийская_кухня|в Викиучебнике]]''' • '''[[w:Категория:Индонезийская_кухня|в Википедии (w)]]'''
}}<noinclude>
[[Категория:Навигационные шаблоны:Кулинария]]
[[Категория:Шаблоны:Кулинарная книга]]
[[Категория:Азиатская кухня]]
[[Категория:Индонезийская кухня]]
</noinclude>
22v8mj2wmguyab190itfj3ypldyqhci
270327
270323
2026-10-09T14:05:29Z
Heffalump1974
37550
дополнение
270327
wikitext
text/x-wiki
{{Навигационная таблица
| name = Индонезийская кухня
| title = [[Индонезийская кухня]]
| state = <includeonly>{{{state|autocollapse}}}</includeonly>
| bodyclass = hlist
| group1 = Блюда из риса (Наси)
| list1 = [[Рецепт:Наси-горенг|Наси-горенг (жареный рис)]] • [[Рецепт:Наси-кунинг|Наси-кунинг (жёлтый рис)]] • [[Рецепт:Наси-удук|Наси-удук]] • [[Рецепт:Лонтонг|Лонтонг (прессованный рис)]] • Кетупат
| group2 = Блюда из лапши (Ми)
| list2 = [[Рецепт:Ми-горенг|Ми-горенг (жареная лапша)]] • [[Рецепт:Ми-аям|Ми-аям]] • [[Рецепт:Бакми|Бакми]]
| group3 = Супы и жидкие блюда
| list3 = [[Рецепт:Сото|Сото (индонезийский суп)]] • [[Рецепт:Баксо|Баксо (суп с фрикадельками)]] • [[Рецепт:Саюр-асем|Саюр-асем]] • [[Рецепт:Суп-бунтут|Суп-бунтут (из бычьих хвостов)]]
| group4 = Мясные и основные блюда
| list4 = [[Рецепт:Сатай|Сатай (шашлычки сатэ)]] • [[Рецепт:Ренданг|Ренданг]] • [[Рецепт:Аям-горенг|Аям-горенг (жареная курица)]] • [[Рецепт:Баби-гулинг|Баби-гулинг]] • [[Рецепт:Опор-аям|Опор-аям]]
| group5 = Салаты, закуски и соусы
| list5 = [[Рецепт:Гадо-гадо|Гадо-гадо]] • [[Рецепт:Кетопрак|Кетопрак]] • [[Рецепт:Крупук|Крупук (чипсы)]] • [[Рецепт:Самбал|Самбал (острый соус)]] • [[Рецепт:Соус_Арахисовый|Соус арахисовый]] • [[Рецепт:Ачар|Ачар (маринованные овощи)]] • [[Рецепт:Темпе|Темпе]]
| group6 = Сладости и напитки
| list6 = [[Рецепт:Писанг-горенг|Писанг-горенг (жареные бананы)]] • [[Рецепт:Клепон|Клепон]] • [[Рецепт:Колак|Колак]] • [[Рецепт:Эс-телер|Эс-телер (кокосовый коктейль)]] • [[Рецепт:Копи-лувак|Кофе лувак]] • Чендол
| belowstyle = font-weight:bold;
| below = Категория «Индонезийская кухня»: '''[[:Категория:Индонезийская_кухня|в Викиучебнике]]''' • '''[[w:Категория:Индонезийская_кухня|в Википедии (w)]]'''
}}<noinclude>
[[Категория:Навигационные шаблоны:Кулинария]]
[[Категория:Шаблоны:Кулинарная книга]]
[[Категория:Азиатская кухня]]
[[Категория:Индонезийская кухня]]
</noinclude>
id52sm736d54jg1uz8sbpaoc1nrb0xp