Spec-Zone.ru › Perl 5.34

perlwin32

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНОПСИС
  • ОПИСАНИЕ
    • Настройка Perl на Windows
    • Компиляция
    • Тестирование Perl на Windows
    • Установка Perl на Windows
    • Рекомендации по использованию Perl на Windows
    • Запуск скриптов Perl
    • Разное
  • ОШИБКИ И ОСОБЕННОСТИ
  • БЛАГОДАРНОСТИ
  • АВТОРЫ
  • СМОТРИТЕ ТАКЖЕ
  • ИСТОРИЯ

НАЗВАНИЕ

perlwin32 - Perl под Windows

СИНОПСИС

Эти инструкции предназначены для компиляции Perl под Windows 2000 и более поздними версиями.

ОПИСАНИЕ

Прежде чем начать, ознакомьтесь с файлом README, расположенным в корневом каталоге, куда была распакована дистрибуция Perl. Убедитесь, что вы ознакомились и поняли условия распространения данного программного обеспечения.

Также убедитесь, что вы прочитали раздел "ОШИБКИ И ОСОБЕННОСТИ" ниже, чтобы ознакомиться с известными ограничениями данного порта.

Файл INSTALL в корневом каталоге perl содержит много информации, которая актуальна только для людей, компилирующих Perl на системах Unix. В частности, вы можете безопасно пропустить любую информацию, в которой упоминается "Configure".

Вы также можете рассмотреть другой вариант построения perl, работающего под Windows: файл README.cygwin, который предоставляет другой набор правил для создания perl для Windows. Этот метод, вероятно, позволит вам создать более совместимый с Unix perl, но вам также потребуется загрузить и использовать различные другие программные средства поддержки во время компиляции и выполнения, описанные в этом файле.

Этот набор инструкций предназначен для описания так называемого "родного" порта Perl для платформы Windows. Это включает как 32-битные, так и 64-битные операционные системы Windows. Результирующий Perl не требует дополнительного программного обеспечения для работы (кроме того, что поставляется с вашей операционной системой). В настоящее время этот порт поддерживает использование одного из следующих компиляторов на архитектуре Intel x86:

Microsoft Visual C++    version 6.0 or later
Intel C++ Compiler      (experimental)
Gcc by mingw.org        gcc version 3.4.5-5.3.0
Gcc by mingw-w64.org    gcc version 4.4.3 or later

Обратите внимание, что две последние из них фактически являются конкурирующими проектами, оба предоставляющими полную среду разработки gcc для MS Windows:

http://mingw.org

Предоставляет среду разработки gcc, нацеленную на 32-битную платформу Windows.

http://mingw-w64.org

Предоставляет среду разработки gcc, нацеленную как на 64-битную, так и на 32-битную платформы Windows (несмотря на название проекта "mingw-w64", они не ориентированы только на 64-битные). Они предоставляют родные компиляторы gcc и кросс-компиляторы, которые также поддерживаются makefile perl.

Компиляторы Microsoft Visual C++ также теперь предоставляются бесплатно. Они доступны как "Visual C++ Toolkit 2003" или "Visual C++ 2005-2019 Express [или Community, начиная с 2017 года] Edition" (и также как часть ".NET Framework SDK") и являются теми же компиляторами, которые поставляются с "Visual C++ .NET 2003 Professional" или "Visual C++ 2005-2019 Professional" соответственно.

Этот порт также может быть скомпилирован на IA64/AMD64 с помощью:

Microsoft Platform SDK    Nov 2001 (64-bit compiler and tools)
MinGW64 compiler (gcc version 4.4.3 or later)

Windows SDK можно загрузить с https://developer.microsoft.com/windows/downloads/sdk-archive. Компилятор MinGW64 доступен по адресу http://mingw-w64.org. Последний фактически является кросс-компилятором, ориентированным на Win64. Также доступен усеченный компилятор (без java или gfortran), подходящий для компиляции perl: http://strawberryperl.com/package/kmx/64_gcctoolchain/

ПРИМЕЧАНИЕ: Если вы используете 32-битный компилятор для компиляции perl на 64-битной операционной системе Windows, установите переменную среды WIN64 в значение "undef". Кроме того, усеченный компилятор проходит тесты только при USE_ITHREADS *= define (в отличие от undef) и при том, что строка CFG *= Debug закомментирована.

Этот порт полностью поддерживает MakeMaker (набор модулей, используемых для компиляции расширений для perl). Поэтому вы должны иметь возможность компилировать и устанавливать большинство расширений, найденных на сайтах CPAN. См. "Рекомендации по использованию Perl на Windows" ниже для общих советов по этому.

Настройка Perl на Windows

Make

Для сборки исходных кодов вам необходима программа «make». Если вы используете Visual C++ или инструменты Windows SDK, вы можете использовать nmake, поставляемый с Visual C++ или Windows SDK. Вы также можете использовать gmake вместо nmake. Для сборок с использованием gcc требуется gmake. nmake не поддерживается для сборок с gcc. Параллельная сборка поддерживается только с gmake, а не с nmake.

Командная оболочка

Используйте стандартную командную оболочку «cmd», которая поставляется с Windows. Некоторые версии популярной оболочки 4DOS/NT имеют несовместимости, которые могут вызвать проблемы. Если сборка завершается неудачно в этой оболочке, попробуйте выполнить сборку снова с использованием оболочки cmd.

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

Microsoft Visual C++

Для сборки достаточно nmake, поставляемого с Visual C++. Visual C++ требует, чтобы некоторые вещи были настроены в консоли перед успешным запуском Visual C++. Чтобы консольная программа могла запускать компилятор C, вам предварительно необходимо выполнить vcvarsall.bat x86 для компиляции для x86-32 и для x86-64 vcvarsall.bat amd64. В типичной установке продукта Microsoft C++ компилятора эти пакетные файлы уже будут в вашей переменной среды PATH, поэтому вы можете ввести их в свою консоль без абсолютного пути. Если вам нужно найти абсолютный путь к пакетному файлу, он обычно находится где-то в C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC. В некоторых новых продуктах Microsoft C (выпущенных после ~2004 года) установщик добавит ярлык в меню Пуск для запуска нового окна консоли с уже настроенной консолью для вашей целевой архитектуры (x86-32 или x86-64 или IA64). С новыми компиляторами вы также можете использовать старые пакетные файлы, если хотите.

Microsoft Visual C++ 2008-2019 Express/Community Edition

Эти бесплатные версии Visual C++ 2008-2019 Professional содержат те же компиляторы и компоновщики, что и полные версии, а также все необходимое для сборки Perl, без необходимости отдельной загрузки Windows SDK, как в предыдущих версиях.

Эти пакеты можно загрузить, выполнив поиск в Центре загрузок по адресу https://www.microsoft.com/downloads/search.aspx?displaylang=en. (Предоставление точных ссылок на эти пакеты оказалось бесполезным, поскольку ссылки постоянно меняются.)

Установите Visual C++ 2008-2019 Express/Community, затем настройте свою среду, например:

C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat

(предполагая, что был выбран стандартный путь установки).

Теперь Perl должен собираться с помощью win32/Makefile. Вам сначала необходимо отредактировать этот файл, чтобы установить CCTYPE на одно из значений MSVC90-MSVC142.

Microsoft Visual C++ 2005 Express Edition

Эта бесплатная версия Visual C++ 2005 Professional содержит тот же компилятор и компоновщик, что и полная версия, но не содержит всего необходимого для сборки Perl.

Вам также потребуется загрузить «Windows SDK» (требуются компоненты «Core SDK» и «MDAC SDK») для получения дополнительных заголовочных файлов и библиотек.

Эти пакеты можно загрузить, выполнив поиск в Центре загрузок по адресу http://www.microsoft.com/downloads/search.aspx?displaylang=en. (Предоставление точных ссылок на эти пакеты оказалось бесполезным, поскольку ссылки постоянно меняются.)

Постарайтесь получить последнюю версию Windows SDK. Иногда эти пакеты содержат в своем названии определённую версию операционной системы Windows, но на самом деле они работают и на других версиях ОС. Например, «Windows Server 2003 R2 Platform SDK» также работает на Windows XP SP2 и Windows 2000.

Сначала установите Visual C++ 2005, затем Platform SDK. Настройте свою среду следующим образом (предполагая стандартные пути установки):

SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK

SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;C:\Program Files\Microsoft Visual Studio 8\VC\BIN;C:\Program Files\Microsoft Visual Studio 8\Common7\Tools;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 8\VC\VCPackages;%PlatformSDKDir%\Bin

SET INCLUDE=C:\Program Files\Microsoft Visual Studio 8\VC\INCLUDE;%PlatformSDKDir%\include

SET LIB=C:\Program Files\Microsoft Visual Studio 8\VC\LIB;C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\lib;%PlatformSDKDir%\lib

SET LIBPATH=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

(Возможно, PlatformSDKDir необходимо установить по-другому в зависимости от используемой версии. Более ранние версии устанавливались в «C:\Program Files\Microsoft SDK», в то время как последние версии устанавливаются в местоположения, зависящие от версии, такие как «C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2».)

Perl теперь должен собираться с помощью win32/Makefile. Вам необходимо отредактировать этот файл, чтобы установить

CCTYPE = MSVC80

и установить CCHOME, CCINCDIR и CCLIBDIR в соответствии с настройкой среды выше.

Microsoft Visual C++ Toolkit 2003

Этот бесплатный набор инструментов содержит тот же компилятор и компоновщик, что и Visual C++ .NET 2003 Professional, но не содержит всего необходимого для сборки Perl.

Вам также потребуется загрузить «Platform SDK» (требуются компоненты «Core SDK» и «MDAC SDK») для заголовочных файлов, библиотек и rc.exe, а также «.NET Framework SDK» для дополнительных библиотек и nmake.exe. Обратите внимание, что последний (который также включает бесплатный компилятор и компоновщик) требует предварительной установки ".NET Framework Redistributable". Его можно загрузить и установить отдельно, но он включён в «Visual C++ Toolkit 2003».

Эти пакеты можно загрузить, выполнив поиск в Центре загрузок по адресу https://www.microsoft.com/downloads/search.aspx?displaylang=en. (Предоставление точных ссылок на эти пакеты оказалось бесполезным, поскольку ссылки постоянно меняются.)

Постарайтесь получить последнюю версию Windows SDK. Иногда эти пакеты содержат в своем названии определённую версию операционной системы Windows, но на самом деле они работают и на других версиях ОС. Например, «Windows Server 2003 R2 Platform SDK» также работает на Windows XP SP2 и Windows 2000.

Сначала установите Toolkit, затем Platform SDK, затем .NET Framework SDK. Настройте свою среду следующим образом (предполагая стандартные пути установки):

SET PlatformSDKDir=C:\Program Files\Microsoft Platform SDK

SET PATH=%SystemRoot%\system32;%SystemRoot%;C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin;%PlatformSDKDir%\Bin;C:\Program Files\Microsoft.NET\SDK\v1.1\Bin

SET INCLUDE=C:\Program Files\Microsoft Visual C++ Toolkit 2003\include;%PlatformSDKDir%\include;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include

SET LIB=C:\Program Files\Microsoft Visual C++ Toolkit 2003\lib;%PlatformSDKDir%\lib;C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\lib

(Возможно, PlatformSDKDir необходимо установить по-другому в зависимости от используемой версии. Более ранние версии устанавливались в «C:\Program Files\Microsoft SDK», в то время как последние версии устанавливаются в местоположения, зависящие от версии, такие как «C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2».)

Несколько необходимых файлов всё ещё отсутствуют:

  • cvtres.exe необходим link.exe при использовании файла .res. На самом деле он установлен .NET Framework SDK, но в таком расположении:

    C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322

    Скопируйте его оттуда в %PlatformSDKDir%\Bin

  • lib.exe обычно используется для создания библиотек, но link.exe с опцией /lib также работает, поэтому измените win32/config.vc, чтобы использовать его вместо этого:

    Измените строку:

    ar='lib'

    на:

    ar='link /lib'

    Также может быть полезно создать пакетный файл с именем lib.bat в C:\Program Files\Microsoft Visual C++ Toolkit 2003\bin, содержащий:

    @echo off
    link /lib %*

    для удобства работы с любыми проблемными модулями расширения C, которые вы можете захотеть скомпилировать позже, которые явно ссылаются на «lib», а не берут значение из $Config{ar}.

  • setargv.obj необходим для сборки perlglob.exe (и perl.exe, если включена опция USE_SETARGV). Platform SDK предоставляет этот объектный файл в исходной форме в %PlatformSDKDir%\src\crt. Скопируйте setargv.c, cruntime.h и internal.h в какое-то временное место и скомпилируйте setargv.obj с помощью

    cl.exe /c /I. /D_CRTBLD setargv.c

    Затем скопируйте setargv.obj в %PlatformSDKDir%\lib

    В качестве альтернативы, если вам не нужен perlglob.exe и не нужно включать опцию USE_SETARGV, то вы можете безопасно удалить все упоминания $(GLOBEXE) из win32/Makefile, и setargv.obj не потребуется.

Perl теперь должен собираться с помощью win32/Makefile. Вам необходимо отредактировать этот файл, чтобы установить

CCTYPE = MSVC70FREE

и установить CCHOME, CCINCDIR и CCLIBDIR в соответствии с настройкой среды выше.

Компилятор Microsoft Platform SDK 64-разрядный

Для сборки Perl достаточно nmake, поставляемого с Platform SDK. Убедитесь, что вы выполняете сборку в одной из доступных оболочек «Среда сборки» после установки Platform SDK из меню Пуск.

GCC

Perl можно скомпилировать с помощью gcc из MinGW (версия 3.4.5 или выше) или MinGW64 (версия 4.4.3 или выше). Его можно загрузить здесь:

http://www.mingw.org/ http://www.mingw-w64.org/

Вам также необходим gmake. Обычно он поставляется с MinGW, но его исполняемый файл может иметь другое имя, например, mingw32-make.exe.

Обратите внимание, что сборка MinGW в настоящее время завершается неудачно с версией 6.3.0 или выше.

Обратите также внимание, что сборка в режиме C++ в настоящее время завершается неудачно с MinGW 3.4.5 и 4.7.2 или выше, а также с MinGW64 64-бит 6.3.0 или выше.

Компилятор Intel C++

Добавлена экспериментальная поддержка использования компилятора Intel C++. Отредактируйте win32/Makefile и выберите правильный CCTYPE для Visual C, в который был установлен компилятор Intel C. Также необходимо раскомментировать __ICC, чтобы включить поддержку Intel C в Visual C. Для настройки среды сборки из меню Пуск запустите режим IA-32 Visual Studio 20__ или режим Intel 64 Visual Studio 20__ в соответствии с требованиями. Затем запустите nmake, как обычно, в этом окне командной строки.

Только компилятор Intel C++ v12.1 был протестирован. Другие версии, вероятно, также будут работать. Использование компилятора Intel C++ вместо Visual C имеет преимущество совместимости с C99, которое требуется некоторым модулям CPAN XS, при сохранении совместимости с объектным кодом Visual C и инфраструктурой отладки Visual C в отличие от GCC.

Сборка

  • Убедитесь, что вы находитесь в подкаталоге "win32" в верхней директории perl. Этот каталог содержит "Makefile", который будет работать с версиями nmake, поставляемыми с Visual C++, или Windows SDK, и "GNUmakefile" для GNU make, который будет работать со всеми поддерживаемыми компиляторами. Значения по умолчанию в файле gmake настроены для сборки с использованием MinGW/gcc.

  • Отредактируйте GNUmakefile (или Makefile, если вы используете nmake) и измените значения INST_DRV и INST_TOP. Вы также можете включить различные флаги сборки. Они объяснены в файлах make.

    Обратите внимание, что обычно не рекомендуется пытаться собрать perl с INST_DRV и INST_TOP, установленным на путь, который уже существует из предыдущей сборки. В частности, это может вызвать проблемы с тестом lib/ExtUtils/t/Embed.t, который пытается собрать тестовую программу и может оказаться построенным против установленного каталога perl lib/CORE, а не того, который тестируется.

    Вам нужно будет убедиться, что CCTYPE установлен правильно, и что CCHOME указывает на место, где вы установили свой компилятор. Для GCC это должна быть директория, содержащая каталоги bin, include и lib.

    Если вы собираете с кросс-компилятором, предоставленным mingw-w64.org, вам необходимо будет раскомментировать строку, устанавливающую GCCCROSS в GNUmakefile. Делайте это только в том случае, если это кросс-компилятор — то есть только если папка bin не содержит gcc.exe. (Кросс-компилятор не предоставляет gcc.exe, g++.exe, ar.exe и т. д. Вместо этого все эти исполняемые файлы имеют префикс 'x86_64-w64-mingw32-').

    Значение по умолчанию для CCHOME в файлах make для Visual C++ может быть неверным для некоторых версий. Убедитесь, что значение по умолчанию существует и является действительным.

    Если вы хотите статически скомпилировать некоторые расширения ядра в dll perl, укажите их в макросе STATIC_EXT.

    Внимательно прочтите инструкции в начале файлов make.

  • Введите "gmake" (или "nmake", если вы используете этот make).

    Это должно собрать всё. В частности, это создаст perl.exe, perl534.dll в верхней директории perl и различные другие расширения dll в каталоге lib\auto. Если сборка завершится ошибкой по какой-либо причине, убедитесь, что вы правильно выполнили предыдущие шаги.

    Чтобы попробовать параллельный режим gmake, введите "gmake -j2", где 2 — максимальное количество параллельных задач, которые вы хотите запустить. Ряд вещей в процессе сборки будут выполняться параллельно, но есть точки сериализации, где вы увидите, что лишь один процессор работает на максимум. Это нормально.

    Если вы достаточно опытный в сборке кода C, вот предложение для ускорения сборки perl и последующей make test. Постарайтесь сохранить переменную среды PATH с наименьшим количеством папок (помните, что каталоги вашего C-компилятора должны быть там). C:\WINDOWS\system32 или C:\WINNT\system32 (в зависимости от версии вашей ОС) должны быть первой папкой в PATH, так как "cmd.exe" — это наиболее часто запускаемая программа во время сборки и последующих тестов.

Тестирование Perl на Windows

Введите "gmake test" (или "nmake test"). Это запустит большинство тестов из набора тестов (многие тесты будут пропущены).

Не должно быть ошибок в тестах.

Если вы собираете с Visual C++ 2013, то три теста в настоящее время могут завершиться ошибкой из-за проблем, связанных с летним временем: t/io/fs.t, cpan/HTTP-Tiny/t/110_mirror.t и lib/File/Copy.t. Ошибки вызваны ошибками в CRT в VC++ 2013, которые исправлены в VC++2015 и более поздних версиях, как объясняется Microsoft здесь: https://connect.microsoft.com/VisualStudio/feedback/details/811534/utime-sometimes-fails-to-set-the-correct-file-times-in-visual-c-2013. В то же время, если вам нужны исправленные stat и utime функции, посмотрите на дистрибутив CPAN Win32::UTCFileTime.

Если вы собираете с Visual C++ 2015 или более поздней версии, то ext/XS-APItest/t/locale.t может аварийно завершиться (после того, как все его тесты пройдут). Это связано с регрессией в универсальной CRT, введённой в обновлении Windows 10 от апреля 2018 года, и будет исправлена в обновлении от мая 2019 года, как объясняется здесь: https://developercommunity.visualstudio.com/content/problem/519486/setlocalelc-numeric-iso-latin-16-fails-then-succee.html.

Если вы собираете с определёнными версиями (например, 4.8.1) gcc с www.mingw.org, то ext/POSIX/t/time.t может завершить тест 17 с ошибкой из-за известной ошибки в этих сборках gcc: см. https://sourceforge.net/p/mingw/bugs/2152/.

Некоторые ошибки в тестах могут произойти, если вы используете оболочку командной строки, отличную от родной "cmd.exe", или если вы собираете из пути, содержащего пробелы. Поэтому этого не делайте.

Если вы запускаете тесты из окна оболочки emacs, вы можете увидеть ошибки в op/stat.t. В этом случае выполните "gmake test-notty".

Кроме того, убедитесь, что во время make test у вас нет пакетов GNU-инструментов в вашем пути: некоторые наборы инструментов, например, Unixutils, включают некоторые инструменты (type например), которые переопределяют инструменты Windows и приводят к ошибкам в тестах. Удалите их из вашего пути во время тестирования, чтобы избежать этих ошибок.

Чтобы увидеть вывод определённых ошибочных тестов, запустите утилиту из каталога t:

# assuming you're starting from the win32 directory
cd ..\win32
.\perl harness <list of tests>

Пожалуйста, сообщите о любых других ошибках, как описано в разделе "ОШИБКИ И ЗАМЕЧАНИЯ".

Установка Perl на Windows

Введите "gmake install" ("nmake install"). Это поместит только что собранный perl и библиотеки в то место, куда указывает INST_TOP в Makefile. Это также установит документацию pod в $INST_TOP\$INST_VER\lib\pod и HTML-версии в $INST_TOP\$INST_VER\lib\pod\html.

Чтобы использовать только что установленный Perl, вам нужно будет добавить новую запись в переменную среды PATH: $INST_TOP\bin, например:

set PATH=c:\perl\bin;%PATH%

Если вы выбрали раскомментировать INST_VER и INST_ARCH в файле make, то структура установки немного сложнее, и вам нужно будет добавить две новые компоненты PATH: $INST_TOP\$INST_VER\bin и $INST_TOP\$INST_VER\bin\$ARCHNAME, например:

set PATH=c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH%

Рекомендации по использованию Perl на Windows

Переменные среды

Пути установки, которые вы задаёте во время сборки, компилируются в perl, поэтому вам ничего дополнительно не нужно делать, чтобы начать использовать этот perl (кроме добавления его расположения в переменную среды PATH).

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

Вы также можете управлять оболочкой, которую perl использует для выполнения команд system() и обратных кавычек, через PERL5SHELL. См. perlrun.

Perl не зависит от реестра, но он может найти некоторые значения по умолчанию, если вы выберете их, если только они не отключены во время сборки с USE_NO_REGISTRY. При запуске процесса Perl проверяет, существуют ли HKEY_CURRENT_USER\Software\Perl и HKEY_LOCAL_MACHINE\Software\Perl. Если ключи существуют, они будут проверяться на протяжении всего выполнения процесса Perl для определенных записей. Записи в HKEY_CURRENT_USER\Software\Perl переопределяют записи в HKEY_LOCAL_MACHINE\Software\Perl. В ключах может быть установлена одна или несколько из следующих записей (типа REG_SZ или REG_EXPAND_SZ):

lib-$]        version-specific standard library path to add to @INC
lib           standard library path to add to @INC
sitelib-$]    version-specific site library path to add to @INC
sitelib       site library path to add to @INC
vendorlib-$]  version-specific vendor library path to add to @INC
vendorlib     vendor library path to add to @INC
PERL*         fallback for all %ENV lookups that begin with "PERL"

Обратите внимание, что $] в приведенном выше примере не является буквальным. Замените его на любую версию perl, которую вы хотите использовать в этой записи, например 5.6.0. Пути должны быть разделены точкой с запятой, как обычно в Windows.

Подстановка шаблонов файлов

По умолчанию perl обрабатывает подстановку шаблонов файлов с помощью расширения File::Glob, которое обеспечивает переносимую подстановку шаблонов.

Если вы хотите, чтобы perl использовал подстановку шаблонов, имитирующую особенности соглашений об именах файлов DOS, вы можете использовать File::DosGlob для переопределения внутренней реализации glob(). См. File::DosGlob для получения подробной информации.

Использование perl из командной строки

Если вы привыкли использовать perl из различных командных оболочек, встречающихся в средах UNIX, вас не порадует то, что предлагает Windows в качестве командной оболочки.

Существенный момент для понимания в среде Windows заключается в том, что командная строка, которую вы вводите, обрабатывается дважды до того, как perl её увидит. Сначала ваша командная оболочка (обычно CMD.EXE) предварительно обрабатывает командную строку, чтобы обработать перенаправление, расширение переменных среды и определение расположения исполняемого файла для запуска. Затем исполняемый файл perl разделяет оставшуюся командную строку на отдельные аргументы, используя библиотеку C-времени, на которой построен perl.

Очень важно отметить, что ни оболочка, ни библиотека C-времени не выполняют расширения подстановочных знаков для аргументов командной строки (поэтому подстановочные знаки не нужно заключать в кавычки). Кроме того, поведение кавычек оболочки и библиотеки C-времени в лучшем случае является примитивным (и может быть несовместимым, если вы используете нестандартную оболочку). Единственный (полезный) символ кавычек — двойная кавычка ("). Она может использоваться для защиты пробелов и других специальных символов в аргументах.

Документация Windows описывает правила разбора оболочек здесь: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/cmd, а правила разбора библиотеки C-времени здесь: https://msdn.microsoft.com/en-us/library/17w5ykft%28v=VS.100%29.aspx.

Вот некоторые дополнительные наблюдения, основанные на экспериментах: Библиотека C-времени разбивает аргументы по пробелам и передает их программам в argc/argv. Двойные кавычки могут использоваться для предотвращения разделения аргументов, содержащих пробелы. Вы можете поместить двойную кавычку в аргумент, экранировав её обратной косой чертой и заключив весь аргумент в двойные кавычки. Библиотека C-времени удалит обратную косую черту и пару двойных кавычек, окружающих аргумент.

Символы перенаправления файлов "<", ">" и "|" могут быть заключены в двойные кавычки (хотя есть предположения, что это не всегда верно). Одинарные кавычки не обрабатываются как кавычки оболочкой или библиотекой C-времени, они не удаляются оболочкой (чтобы сделать этот тип кавычек совершенно бесполезным). Также было замечено, что символ «^» ведет себя как символ кавычек, но это, по-видимому, функция оболочки, и символ «^» не удаляется из командной строки, поэтому perl его всё ещё видит (и фаза библиотеки C-времени не обрабатывает символ «^» как символ кавычек).

Вот несколько примеров использования оболочки "cmd":

Это печатает две двойные кавычки:

perl -e "print '\"\"' "

Это делает то же самое:

perl -e "print \"\\\"\\\"\" "

Это печатает «bar» и записывает «foo» в файл «blurch»:

perl -e "print 'foo'; print STDERR 'bar'" > blurch

Это печатает «foo» («bar» исчезает):

perl -e "print 'foo'; print STDERR 'bar'" 2> nul

Это печатает «bar» и записывает «foo» в файл «blurch»:

perl -e "print 'foo'; print STDERR 'bar'" 1> blurch

Это перенаправляет «foo» в диспетчер страниц «less» и выводит «bar» на консоль:

perl -e "print 'foo'; print STDERR 'bar'" | less

Это перенаправляет «foo\nbar\n» в диспетчер страниц «less»:

perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | less

Это перенаправляет «foo» в диспетчер страниц и записывает «bar» в файл «blurch»:

perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less

Открытие полезности оболочки "command.com" в Windows 9x остается упражнением для читателя :)

Одной из особенно неприятных проблем с командной оболочкой 4NT для Windows является то, что она (почти) всегда обрабатывает символ «%» как указание на необходимость расширения переменной среды. В этой оболочке, поэтому, важно всегда удваивать любые символы «%», которые вы хотите увидеть в perl (например, для переменных хеша), даже если они заключены в кавычки.

Сборка расширений

Comprehensive Perl Archive Network (CPAN) предлагает множество расширений, некоторые из которых требуют компилятора C для сборки. Смотрите в https://www.cpan.org/ для получения дополнительной информации о CPAN.

Обратите внимание, что не все расширения, доступные из CPAN, могут работать в среде Windows; вы должны проверить информацию на https://www.cpantesters.org/ перед тем, как вкладывать слишком много усилий в портирование модулей, которые не собираются легко.

Большинство расширений (независимо от того, требуют ли они компилятора C или нет) могут быть собраны, протестированы и установлены с помощью стандартного подхода:

perl Makefile.PL
$MAKE
$MAKE test
$MAKE install

где $MAKE — это программа «make», которую вы настроили для использования в perl. Используйте "perl -V:make", чтобы узнать, что это такое. Некоторые расширения могут не предоставлять тест-свит (так что "$MAKE test" может ничего не делать или завершиться сбоем), но большинство серьёзных расширений это делают.

Важно использовать поддерживаемую программу «make» и убедиться, что Config.pm знает об этом.

Обратите внимание, что MakeMaker фактически генерирует makeфайлы с различным синтаксисом в зависимости от того, какую программу «make» он считает используемой. Поэтому важно, чтобы одно из следующих значений появилось в Config.pm:

make='nmake'        # MakeMaker emits nmake syntax
any other value     # MakeMaker emits generic make syntax
                        (e.g GNU make, or Perl make)

Если значение не соответствует программе «make», которую вы хотите использовать, измените Config.pm, чтобы исправить это.

Если модуль реализует XSUB, вам понадобится один из поддерживаемых компиляторов C. Вы должны убедиться, что вы настроили среду для компилятора для командной компиляции перед запуском perl Makefile.PL или любого вызова make.

Если модуль не собирается по какой-либо причине, внимательно изучите причину сбоя и сообщите об ошибке автору модуля. Если похоже, что проблема в поддержке сборки расширений, сообщите об этом с подробным описанием того, как произошёл сбой сборки, используя систему отслеживания проблем GitHub по адресу https://github.com/Perl/perl5/issues.

Расширение подстановочных знаков в командной строке

Стандартные командные оболочки систем, являющихся потомками DOS (такими как они есть), обычно не расширяют аргументы с подстановочными знаками, передаваемые программам. Они считают, что эта задача лежит на приложении (в нашем случае, perl). Это обычно достигается путём связи приложения (в нашем случае, perl) с начальным кодом, который обычно предоставляют библиотеки времени выполнения C. Однако это приводит к несовместимости версий perl (так как поведение кода расширения argv отличается в зависимости от компилятора, и оно даже глючит в некоторых компиляторах). Кроме того, это может стать источником раздражения, если вы используете такой исполняемый файл perl с альтернативной оболочкой, которая *расширяет* подстановочные знаки.

Вместо этого, следующее решение работает довольно хорошо. Преимущества заключаются в том, что 1) вы можете начать использовать его сразу; 2) оно более мощное, потому что оно будет правильно работать с таким шаблоном, как */*/*.c; 3) вы можете решить, хотите ли вы его использовать; и 4) вы можете расширить этот метод, чтобы добавить любые настройки (или даже совершенно другие типы расширения подстановочных знаков).

C:\> copy con c:\perl\lib\Wild.pm
# Wild.pm - emulate shell @ARGV expansion on shells that don't
use File::DosGlob;
@ARGV = map {
             my @g = File::DosGlob::glob($_) if /[*?]/;
             @g ? @g : $_;
           } @ARGV;
1;
^Z
C:\> set PERL5OPT=-MWild
C:\> perl -le "for (@ARGV) { print }" */*/perl*.c
p4view/perl/perl.c
p4view/perl/perlio.c
p4view/perl/perly.c
perl5.005/win32/perlglob.c
perl5.005/win32/perllib.c
perl5.005/win32/perlglob.c
perl5.005/win32/perllib.c
perl5.005/win32/perlglob.c
perl5.005/win32/perllib.c

Обратите внимание, что здесь есть два отдельных шага: 1) вам нужно создать Wild.pm и поместить его в свой каталог perl lib. 2) вам нужно установить переменную среды PERL5OPT. Если вы хотите, чтобы расширение подстановочных знаков argv было по умолчанию, просто установите PERL5OPT в вашей среде по умолчанию.

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

Примечания по 64-разрядным Windows

Windows .NET Server поддерживает модель данных LLP64 на архитектуре Intel Itanium.

Модель данных LLP64 отличается от модели данных LP64, которая является нормой в 64-разрядных платформах Unix. В первом случае int и long являются 32-разрядными типами данных, а указатели имеют 64 бита. Кроме того, существует отдельный 64-разрядный целочисленный тип __int64. В отличие от этого, модель данных LP64, распространённая на платформах Unix, предоставляет int как 32-разрядный тип, в то время как тип long и указатели имеют 64-битную точность. Обратите внимание, что обе модели обеспечивают 64 бита адресации.

64-разрядные Windows, работающие на Itanium, способны прозрачно запускать 32-разрядные x86 исполняемые файлы. Это означает, что вы можете использовать 32-разрядную сборку perl на 64-разрядной системе. Исходя из этого, зачем нужен 64-разрядный perl? Вот некоторые причины:

  • Прикладное приложение с 64-битным кодом будет работать значительно эффективнее на оборудовании Itanium.

  • Нет предела размера процесса в 2 ГБ.

  • Perl автоматически поддерживает большие файлы при сборке под 64-битными Windows.

  • Встраивание perl в 64-битную программу.

Запуск скриптов perl

Скрипты perl в UNIX используют строку "#!" (также известную как "shebang"), чтобы указать операционной системе, что она должна выполнить файл с помощью perl. Windows не имеет аналогичного способа указания, что произвольные файлы являются исполняемыми.

Вместо этого, все доступные методы выполнения текстовых файлов в Windows зависят от расширения файла. Существует три метода использования этого для выполнения скриптов perl:

  1. Существует возможность, называемая "ассоциациями расширений файлов". Она может быть изменена с помощью двух команд "assoc" и "ftype", которые входят в стандартный набор Windows. Введите "ftype /?" для получения полного примера того, как настроить это для скриптов perl (Вы что? Вы думали, что Windows не поддерживает perl? :).

  2. Поскольку ассоциации файлов не работают везде, и, по сообщениям, есть ошибки в работе ассоциаций файлов, может быть использован старый метод обертывания скрипта perl, чтобы он выглядел как обычный пакетный файл для ОС. Процесс установки предоставляет скрипт "pl2bat.bat", который может использоваться для обертывания скриптов perl в пакетные файлы. Например:

    pl2bat foo.pl

    создаст файл "FOO.BAT". Обратите внимание, что "pl2bat" удаляет любой суффикс .pl и добавляет суффикс .bat к сгенерированному файлу.

    Если вы используете командную оболочку 4DOS/NT или аналогичную, обратите внимание, что "pl2bat" использует переменную "%*" в сгенерированном пакетном файле для ссылки на все аргументы командной строки, поэтому вам может потребоваться убедиться, что эта конструкция работает в пакетных файлах. На момент написания этой статьи пользователям 4DOS/NT потребуется оператор "ParameterChar = *" в файле 4NT.INI или им потребуется выполнить "setdos /p*" в файле запуска 4DOS/NT для активации этой функции.

  3. Использование "pl2bat" имеет несколько проблем: имя файла изменяется, поэтому скрипты, которые полагаются на $0 для определения того, что им нужно сделать, могут работать неправильно; выполнение "pl2bat" дублирует содержимое исходного скрипта, поэтому этот процесс может быть трудоёмким, если оригиналы часто обновляются. Возможен другой подход, который избегает обеих проблем.

    Доступен скрипт "runperl.bat", который можно скопировать в любой файл (вместе с расширением .bat). Например, если вы назовёте его "foo.bat", он выполнит файл "foo" при выполнении. Поскольку вы можете запускать пакетные файлы в платформах Windows, просто набрав имя (без расширения), это фактически выполняет файл "foo", когда вы набираете либо "foo", либо "foo.bat". С этим методом "foo.bat" может даже находиться в другом месте, чем файл "foo", если "foo" доступен где-либо в PATH. Если ваши скрипты находятся на файловой системе, которая поддерживает символические ссылки, вы можете даже избежать копирования "runperl.bat".

    Вот небольшое отступление: скопируйте "runperl.bat" в "runperl" и введите "runperl". Объясните наблюдаемое поведение или отсутствие такового. :) Подсказка: Разверните содержимое, находящееся в файле "runperl".

Разные вещи

Установлен полный набор HTML-документации, поэтому вы должны иметь возможность использовать его, если у вас есть веб-браузер, установленный на вашей системе.

perldoc также является полезным инструментом для просмотра информации, содержащейся в документации, особенно в сочетании с построителем страниц, таким как less (в недавних версиях которого есть поддержка Windows). Возможно, вам придется установить переменную среды PAGER, чтобы использовать определённый построитель страниц. "perldoc -f foo" выведет информацию о перл-операторе "foo".

Частая ошибка при использовании этого порта с графической библиотекой, такой как Tk - это предположение о том, что обычное поведение Perl по открытию окна командной строки исчезнет. Это не так. Если вы хотите запустить копию perl без открытия окна командной строки, используйте исполняемый файл wperl, созданный во время процесса установки. Использование точно такое же, как и обычное perl в Windows, за исключением того, что такие параметры, как -h, не работают (поскольку им нужно окно командной строки для вывода).

Если вы обнаружите ошибки в perl, вы можете сообщить о них по адресу https://github.com/Perl/perl5/issues.

ОШИБКИ И ОСОБЕННОСТИ

Norton AntiVirus мешает процессу сборки, особенно если установлен режим "Автозащита, Все файлы, при открытии". В отличие от крупных приложений, процесс сборки perl открывает и изменяет множество файлов. Сканирование каждого файла антивирусом значительно замедляет процесс сборки. Хуже того, с PERLIO=stdio процесс сборки терпит неудачу с необычными сообщениями, поскольку программа проверки вирусов плохо взаимодействует с miniperl.exe при записи файлов конфигурации (похоже, она либо ловит часть написанного файла и считает его подозрительным, либо программа проверки вирусов может "заблокировать" его таким образом, что миниперл не может его обновить). Сборка завершается

set PERLIO=perlio

но это может быть просто удача. Другие антивирусные программы могут иметь аналогичные проблемы.

Расширение оболочки графического интерфейса Git для Windows, например TortoiseGit, замедлит процесс сборки и последующее make test , так как каждый файл проверяется на наличие статуса git, как только он создаётся и/или изменяется. TortoiseGit не вызывает никаких тестов ошибок или проблем сборки в отличие от антивирусного ПО, описанного выше, но он вызывает аналогичное замедление. Рекомендуется использовать диспетчер задач для поиска фоновых процессов, которые используют большое количество ЦП во время процесса сборки.

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

Не все расширения, доступные из CPAN, могут быть собраны или правильно работать в среде Windows. См. "Создание расширений".

Большинство socket() вызовов поддерживаются, но они могут вести себя не так, как в системах Unix. См. perlport для полного списка.

Обработка сигналов может не работать так, как в системах Unix (где она не совсем "работает", так или иначе :). Например, вызов die() или exit() из обработчиков сигналов вызовет исключение, так как большинство реализаций signal() в Windows сильно ограничены. Таким образом, сигналы могут работать только для простых вещей, таких как установка флаговой переменной в обработчике. Использование сигналов в этом порте в настоящее время следует считать неподдерживаемым.

Пожалуйста, сообщите подробное описание любых проблем и решений, которые вы можете найти по адресу <https://github.com/Perl/perl5/issues>, а также вывод, полученный с помощью perl -V.

ПРИЗНАТЕЛЬНОСТИ

Использование верблюда в контексте Perl является торговой маркой O'Reilly и Associates, Inc. Используется с разрешения.

АВТОРЫ

Гэри Нг <71564.1743@CompuServe.COM>
Гурусами Сарати <gsar@activestate.com>
Ник Инг-Симмонс <nick@ing-simmons.net>
Жан Дюбуа <jand@activestate.com>
Стив Хэй <steve.m.hay@googlemail.com>

Этот документ поддерживается Жаном Дюбуа.

СМОТРИТЕ ТАКЖЕ

perl

ИСТОРИЯ

Этот порт был первоначально внесён Гэри Нг около версии 5.003_24 и заимствован из порта Hip Communications, который был доступен в то время. С тех пор разные люди внесли множество изменений.

Поддержка GCC/mingw32 была добавлена в версии 5.005 (Ник Инг-Симмонс).

Поддержка PERL_OBJECT была добавлена в версии 5.005 (ActiveState Tool Corp).

Поддержка эмуляции fork() была добавлена в версии 5.6 (ActiveState Tool Corp).

Поддержка Win9x была добавлена в версии 5.6 (Бенджамин Штуль).

Поддержка 64-битных Windows была добавлена в версии 5.8 (ActiveState Corp).

Последнее обновление: 26 января 2020

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.34.0/perlwin32

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API