Вопрос или проблема
В Term::ReadLine
есть надоедливый косметический дефект, который, похоже, возник из-за пренебрежения обновлением кода для новой Консоли Windows (оставляю вам, хороший читатель, возможность погуглить это самостоятельно).
Сообщение об ошибке выглядит следующим образом:
Не удается получить размер терминала. Вызов Win32 GetConsoleScreenBufferInfo не сработал. Переменные окружения COLUMNS и LINES не сработали. на C:\perl\perl\vendor\lib/Term/ReadLine/readline.pm, строка 410.
- Точная версия Windows: 10.0.26100.3194
- Версия Perl: v5.32.1 (StrawberryPerl)
- Версия модуля readline: Term::ReadLine 1.17
Я знаю, что реализация readline в Perl раньше работала на старой “DOS Box” (CMD shell и так далее); я использовал ее в каком-то коде давным-давно. Здесь я цитирую, что указано в POD для модулей (как прочитано на metacpan.org):
Описание
Этот пакет – всего лишь интерфейс к некоторым другим пакетам. Это заглушка для установки общего интерфейса к различным реализациям ReadLine, найденным на CPAN (в пространстве имен Term::ReadLine::*).
Флориан Рагвиц виноват за Term::ReadLine
(извините, Флориан), но кто поддерживает части, которые сломались на Windows? Да, это вопрос. Это не просто отчет об ошибке или жалоба. Второй вопрос: Видят ли другие пользователи эту ошибку?
Не стесняйтесь говорить мне, что я пишу не в то место. Я часто это слышу.
Вы можете насладиться этим сообщением об ошибке, запустив оболочку либо cpan, либо cpanplus.
Ответ или решение
Теория: Причины возникновения ошибки с Term::ReadLine в Windows 10
Проблема, которую вы описали, связана с несовместимостью некоторых библиотек Perl, в частности, модуля Term::ReadLine, с современной версией Windows Console. Windows Console в последнее время претерпела значительные изменения, и в результате некоторые старые методы взаимодействия с консолью стали устаревшими. В этом контексте ошибка “Unable to get Terminal Size” возникает тогда, когда Term::ReadLine не может получить размеры окна терминала, что вызвано несовместимостью вызова функции GetConsoleScreenBufferInfo из Win32 API.
Наиболее распространенной причиной данной ошибки является то, что Term::ReadLine и связанные с ним модули не были обновлены для работы с изменениями в Windows Console, особенно в версии Windows 10.0.26100.3194. Это приводит к тому, что модуль не может определить размеры окна с помощью привычных методов, таких как переменные окружения COLUMNS и LINES. В результате, это вызывает описанную ошибку при выполнении скриптов, использующих CPAN и связанные с ним инструменты.
Пример: Обзор технической документации
Документация к модулю Term::ReadLine на metacpan.org описывает его как "фронтенд" для различных реализаций ReadLine в CPAN. Это означает, что собственно Term::ReadLine выполняет роль обертки для других реализаций, например, Term::ReadLine::Perl или Term::ReadLine::Gnu. Проблема, с которой вы столкнулись, может быть связана именно с интерфейсом, который использует Term::ReadLine для вызова конкретной реализации.
Применение: Решение проблемы и пути устранения ошибки
-
Обновление и изменение настроек Perl: Во-первых, убедитесь, что вы используете самую последнюю и совместимую с вашей версией Windows версию StrawberryPerl. Периодически обновления Perl содержат исправления таких несовместимостей. Запустите
perl -v
для проверки текущей версии. -
Замена модуля Term::ReadLine: Попробуйте установить альтернативные модули для реализации ReadLine, такие как Term::ReadLine::Gnu, который может иметь лучшее соответствие с вашей ОС. Для этого установите модуль через CPAN:
cpan Term::ReadLine::Gnu
-
Установка переменных окружения: Попробуйте вручную установить переменные COLUMNS и LINES. Пусть это не всегда решает проблему, но может служить временным обходным путем:
set COLUMNS=80 set LINES=24
-
Проверка и изменение скриптов Perl: Просмотрите ваши Perl-скрипты и убедитесь, что в них не используется специфичная функциональность старой версии DOS Box, которая могла не поддерживаться в новой версии терминала Windows.
-
Использование альтернатив эмуляторов терминала: Рассмотрите возможность использования других эмуляторов терминала, таких как Windows Terminal или Git Bash, которые могут иметь более современную поддержку функций, которые не вызывают эту ошибку.
-
Обратная связь и поддержка сообщества: Рассмотрите возможность участия в обсуждении проблемы на форумах и репозиториях, таких как GitHub или CPAN. Там вы можете найти патчи или временные решения от других пользователей, столкнувшихся с той же проблемой.
Таким образом, данная ошибка связана с устареванием части способов обработки терминала в модулях Perl на Windows 10. Активное участие в обновлении используемых модулей и настройка окружения под ваши нужды поможет избежать подобных проблем в будущем.