perlport
СОДЕРЖАНИЕ
- ИМЯ
- ОПИСАНИЕ
- ПРОБЛЕМЫ
- Новые строки
- Порядок байтов и ширина чисел
- Файлы и файловые системы
- Взаимодействие с системой
- Имена команд против путей к файлам
- Сети
- Межпроцессное взаимодействие (IPC)
- Внешние подпрограммы (XS)
- Стандартные модули
- Время и дата
- Наборы символов и кодировка символов
- Международные настройки
- Системные ресурсы
- Безопасность
- Стиль
- Тестеры CPAN
- ПЛАТФОРМЫ
- РЕАЛИЗАЦИИ ФУНКЦИЙ
- Поддерживаемые платформы
- Платформы с окончанием срока службы
- Поддерживаемые платформы (Perl 5.8)
- СМОТРИТЕ ТАКЖЕ
- АВТОРЫ / СОТРУДНИКИ
ИМЯ
perlport - Написание переносимого Perl
ОПИСАНИЕ
Perl работает на многих операционных системах. Хотя большинство из них имеют много общего, у них также есть свои уникальные особенности.
Этот документ призван помочь вам определить, что составляет переносимый код Perl. Таким образом, приняв решение написать переносимый код, вы знаете, где находятся границы и можете оставаться в них.
Существует компромисс между полным использованием возможностей конкретного типа компьютера и использованием возможностей широкого спектра компьютеров. Естественно, по мере расширения вашего диапазона и разнообразия общие факторы уменьшаются, и вы остаетесь с все более и более узким областью общих основ, в котором можно выполнять определенную задачу. Таким образом, когда вы начинаете решать проблему, важно подумать, в какой части кривой компромисса вы хотите работать. В частности, вы должны решить, имеет ли задача, которую вы кодируете, полную общность переносимости или же просто выполнить работу прямо сейчас. Это самый сложный выбор. Остальное легко, потому что Perl предоставляет множество вариантов, какой бы подход вы не выбрали к своей проблеме.
Другими словами, написание переносимого кода обычно заключается в сознательном ограничении доступных вариантов. Естественно, это требует дисциплины и жертв. Произведение переносимости и удобства может быть постоянной величиной. Вас предупредили.
Обратите внимание на два важных момента:
- Не все программы Perl должны быть переносимыми
-
Нет причин, по которым вы не должны использовать Perl как язык для связывания утилит Unix или для прототипирования приложения для Macintosh или для управления реестром Windows. Если по той или иной причине нет смысла стремиться к переносимости в данной программе, не беспокойтесь.
- Практически весь Perl уже является переносимым
-
Не думайте, что создание переносимого кода Perl сложно. Это не так. Perl прилагает все усилия, чтобы преодолеть разрыв между доступными на разных платформах возможностями и всеми способами использования этих возможностей. Таким образом, практически весь код Perl работает на любой машине без модификаций. Но существуют некоторые значительные проблемы при написании переносимого кода, и этот документ целиком посвящен этим проблемам.
Вот общее правило: когда вы решаете задачу, обычно выполняемую на широком спектре платформ, подумайте о написании переносимого кода. Таким образом, вы не теряете много от доступных вариантов реализации, и одновременно можете предоставить своим пользователям множество вариантов платформ. С другой стороны, когда вам необходимо воспользоваться какой-либо уникальной функцией конкретной платформы, как это часто бывает при системном программировании (будь то для Unix, Windows, VMS и т. д.), рассмотрите возможность написания платформоспецифичного кода.
Когда код будет работать только на двух или трех операционных системах, вам может потребоваться учесть только различия этих конкретных систем. Важно решить, где будет работать код, и принять обдуманное решение.
Материал ниже разделен на три основных раздела: основные проблемы переносимости (ПРОБЛЕМЫ), платформоспецифические проблемы (ПЛАТФОРМЫ) и встроенные функции Perl, которые ведут себя по-разному на разных портах (РЕАЛИЗАЦИИ ФУНКЦИЙ).
Эта информация не должна считаться полной; она включает, возможно, временную информацию об особенностях некоторых портов, почти все из которых находятся в состоянии постоянной эволюции. Таким образом, этот материал следует рассматривать как постоянную работу в процессе (<IMG SRC="yellow_sign.gif" ALT="Under Construction">).
ПРОБЛЕМЫ
Новые строки
В большинстве операционных систем строки в файлах завершаются символами новой строки. То, что используется в качестве символа новой строки, может варьироваться от одной ОС к другой. Unix традиционно использует \012, один из типов ввода-вывода DOS использует \015\012, Mac OS использует \015, а z/OS использует \025.
Perl использует \n для представления "логической" новой строки, где то, что логично, может зависеть от используемой платформы. В MacPerl \n всегда означает \015. На платформах EBCDIC \n может быть \025 или \045. В DOS-подобных версиях Perl \n обычно означает \012, но при обращении к файлу в режиме "текст" Perl использует уровень :crlf, который преобразует его в (или из) \015\012, в зависимости от того, читаете вы или записываете. Unix делает то же самое на терминалах в каноническом режиме. \015\012 обычно называют CRLF.
Для удаления хвостовых новых строк из строк текста используйте chomp. В стандартных настройках эта функция ищет заключительный символ \n и, таким образом, выполняет обрезку переносимым способом.
При работе с двоичными файлами (или текстовыми файлами в двоичном режиме) убедитесь, что явно установили $/ в соответствующее значение для вашего формата файла перед использованием chomp.
Из-за преобразования режима "текст" DOS-подобные версии Perl имеют ограничения при использовании seek и tell с файлом, доступным в режиме "текст". Придерживайтесь seek в позиции, которую вы получили из tell (и никакой другой), и вы обычно можете использовать seek и tell даже в режиме "текст". Использование seek или tell или других операций с файлами может быть не переносимым. Однако, если вы используете binmode с файлом, вы обычно можете seek и tell с произвольными значениями безопасно.
Распространенное заблуждение в программировании сокетов заключается в том, что \n eq \012 везде. При использовании протоколов, таких как стандартные интернет-протоколы, \012 и \015 требуются специально, и значения логических \n и \r (возврат каретки) ненадёжны.
print $socket "Hi there, client!\r\n"; # WRONG
print $socket "Hi there, client!\015\012"; # RIGHT Однако использование \015\012 (или \cM\cJ, или \x0D\x0A) может быть утомительным, некрасивым и путающим для тех, кто поддерживает код. Таким образом, модуль Socket предоставляет правильное решение для тех, кто этого хочет.
use Socket qw(:DEFAULT :crlf);
print $socket "Hi there, client!$CRLF" # RIGHT При чтении из сокета помните, что по умолчанию разделитель записей ввода $/ равен \n, но надёжный код сокета распознает либо \012 или \015\012 в качестве конца строки:
while (<$socket>) { # NOT ADVISABLE!
# ...
} Так как оба CRLF и LF заканчиваются LF, разделитель записей ввода можно установить в LF, а любой CR удалить позже. Лучше написать так:
use Socket qw(:DEFAULT :crlf);
local($/) = LF; # not needed if $/ is already \012
while (<$socket>) {
s/$CR?$LF/\n/; # not sure if socket uses LF or CRLF, OK
# s/\015?\012/\n/; # same thing
} Этот пример предпочтительнее предыдущего - даже для платформ Unix - потому что теперь любые \015 (\cM's) удаляются (и все были очень рады).
Аналогично, функции, возвращающие текстовые данные (например, функция, которая извлекает веб-страницу), иногда должны преобразовывать новые строки перед возвратом данных, если они ещё не преобразованы в локальное представление новой строки. Обычно достаточно одной строки кода:
$data =~ s/\015?\012/\n/g;
return $data; Часть из этого может быть запутанной. Вот полезная справка по символам ASCII CR и LF. Вы можете распечатать её и положить в свой бумажник.
LF eq \012 eq \x0A eq \cJ eq chr(10) eq ASCII 10
CR eq \015 eq \x0D eq \cM eq chr(13) eq ASCII 13
| Unix | DOS | Mac |
---------------------------
\n | LF | LF | CR |
\r | CR | CR | LF |
\n * | LF | CRLF | CR |
\r * | CR | CR | LF |
---------------------------
* text-mode STDIO Столбец Unix предполагает, что вы не обращаетесь к последовательному порту (например, tty) в каноническом режиме. Если вы это делаете, то CR на входе становится "\n", а "\n" на выходе становится CRLF.
Вот лишь самые распространенные определения \n и \r в Perl. Возможно, существуют и другие. Например, на реализациях EBCDIC, таких как z/OS (OS/390) или OS/400 (использующих ILE, PASE основаны на ASCII), вышеизложенное похоже на "Unix", но изменяются кодовые числа:
LF eq \025 eq \x15 eq \cU eq chr(21) eq CP-1047 21
LF eq \045 eq \x25 eq chr(37) eq CP-0037 37
CR eq \015 eq \x0D eq \cM eq chr(13) eq CP-1047 13
CR eq \015 eq \x0D eq \cM eq chr(13) eq CP-0037 13
| z/OS | OS/400 |
----------------------
\n | LF | LF |
\r | CR | CR |
\n * | LF | LF |
\r * | CR | CR |
----------------------
* text-mode STDIO Числа, порядок байтов и ширина
Разные процессоры хранят целые числа и числа с плавающей точкой в разном порядке (называемом порядком байтов) и ширине (32-битная и 64-битная являются наиболее распространенными сегодня). Это влияет на ваши программы, когда они пытаются передавать числа в двоичном формате с одной архитектуры процессора на другую, обычно либо "живьём" через сетевое соединение, либо путём сохранения чисел на вторичном носителе, таком как файл диска или лента.
Противоречивые порядки хранения приводят к полному беспорядку с числами. Если компьютер с порядком байтов little-endian (Intel, VAX) хранит 0x12345678 (305419896 в десятичной системе), компьютер с порядком байтов big-endian (Motorola, Sparc, PA) прочтёт его как 0x78563412 (2018915346 в десятичной системе). Alpha и MIPS могут быть как тем, так и другим: Digital/Compaq использовали/используют их в режиме little-endian; SGI/Cray используют их в режиме big-endian. Чтобы избежать этой проблемы в сетевых (сокетов) подключениях, используйте форматы pack и unpack n и N, "сетевой" порядок. Они гарантированно являются переносимыми.
Начиная с Perl 5.10.0, вы также можете использовать модификаторы > и < для принудительного указания порядка байтов big- или little-endian. Это полезно, если вы хотите сохранить целые числа со знаком или 64-битные целые числа, например.
Вы можете исследовать порядок байтов вашей платформы, распаковывая структуру данных, упакованную в родном формате, например:
print unpack("h*", pack("s2", 1, 2)), "\n";
# '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
# '00100020' on e.g. Motorola 68040 Если вам нужно различать архитектуры с разным порядком байтов, вы можете использовать либо переменные, установленные следующим образом:
$is_big_endian = unpack("h*", pack("s", 1)) =~ /01/;
$is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/; Разная ширина может привести к усечению даже между платформами с одинаковым порядком байтов. Платформа с меньшей шириной теряет старшие части числа. Нет хорошего решения для этой проблемы, кроме как избегать передачи или хранения чисел в сыром двоичном формате.
Можно обойти обе эти проблемы двумя способами. Либо передавать и сохранять числа всегда в текстовом формате вместо сырого двоичного формата, либо использовать модули, такие как Data::Dumper и Storable (включены начиная с Perl 5.8). Сохранение всех данных в текстовом формате значительно упрощает задачу.
Файлы и файловые системы
Большинство платформ в наши дни структурируют файлы иерархически. Поэтому можно считать, что все платформы поддерживают понятие "пути", чтобы однозначно идентифицировать файл в системе. Однако способ записи этого пути значительно отличается.
Хотя похожи, спецификации путей файлов отличаются между Unix, Windows, Mac OS, OS/2, VMS, VOS, RISC OS и, вероятно, другими. Например, Unix - одна из немногих ОС, которая имеет элегантную идею единого корневого каталога.
DOS, OS/2, VMS, VOS и Windows могут работать аналогично Unix с / в качестве разделителя путей, или по своим собственным особым способам (например, с несколькими корневыми каталогами и различными "бескорневыми" файлами устройств, такими как NIL: и LPT:).
Mac OS 9 и более ранние версии использовали : в качестве разделителя путей вместо /.
Файловая система может не поддерживать жёсткие ссылки (link) или символические ссылки (symlink, readlink, lstat).
Файловая система может не поддерживать метку времени доступа или метку времени изменения (что означает, что единственная переносимая метка времени - это метка времени изменения), или разрешение в одну секунду для любых меток времени (например, файловая система FAT ограничивает разрешение времени двумя секундами).
«Метка времени изменения индексного узла» (файл -C) может фактически быть «меткой времени создания» (которой она не является в Unix).
Perl под VOS может эмулировать имена файлов Unix с / в качестве разделителя путей. Родные символы пути, больше, меньше, знак номера и знак процента всегда принимаются.
RISC OS perl может эмулировать имена файлов Unix с / в качестве разделителя путей или использовать родной способ и использовать . для разделителя путей и : для обозначения файловых систем и имён дисков.
Не предполагайте семантику доступа к файловой системе Unix: что чтение, запись и выполнение — это все разрешения, которые существуют, и даже если они существуют, что их семантика (например, что означают r, w, и x в каталоге) соответствует Unix. Различные слои совместимости Unix/POSIX обычно пытаются сделать интерфейсы, такие как chmod, работоспособными, но иногда просто не существует хорошего отображения.
Модули File::Spec предоставляют методы для обработки спецификаций путей и возвращают результаты в родном формате для каждой платформы. Это часто не нужно, так как пути в стиле Unix понимаются Perl на каждой поддерживаемой платформе, но если вам нужно создать родные пути для родного утилиты, не понимающего синтаксис Unix, или если вы работаете с путями или компонентами путей в неизвестном (и, следовательно, возможно, родном) синтаксисе, File::Spec — ваш помощник. Вот два коротких примера:
use File::Spec::Functions;
chdir(updir()); # go up one directory
# Concatenate a path from its components
my $file = catfile(updir(), 'temp', 'file.txt');
# on Unix: '../temp/file.txt'
# on Win32: '..\temp\file.txt'
# on VMS: '[-.temp]file.txt' В общем случае, пути к файлам в производственном коде не должны быть жестко закодированы. Лучше делать их вводимыми пользователем или считываемыми из файла конфигурации, помня о том, что синтаксис пути к файлу отличается на разных машинах.
Это особенно заметно в скриптах, таких как Makefiles и наборы тестов, которые часто предполагают / как разделитель путей для подкаталогов.
Также полезен модуль File::Basename из стандартного распределения, который разделяет имя пути на части (основное имя файла, полный путь к каталогу и расширение файла).
Даже если вы находитесь на одной платформе (если вы можете назвать Unix одной платформой), помните, что нельзя рассчитывать на существование или содержимое конкретных файлов или каталогов, специфичных для системы, таких как /etc/passwd, /etc/sendmail.conf, /etc/resolv.conf или даже /tmp/. Например, /etc/passwd может существовать, но не содержать зашифрованные пароли, потому что система использует какую-то форму улучшенной безопасности. Или он может не содержать все учётные записи, потому что система использует NIS. Если код должен полагаться на такой файл, включите описание файла и его формат в документацию кода, затем сделайте лёгким для пользователя возможность переопределить местоположение файла по умолчанию.
Не предполагайте, что текстовый файл закончится символом новой строки. Они должны, но люди забывают.
Не делайте два файла или каталога с одинаковым именем и разным регистром, например, test.pl и Test.pl, так как многие платформы нечувствительны к регистру (или по крайней мере к регистру). Также старайтесь избегать небуквенных символов (кроме .) в именах и придерживайтесь соглашения 8.3 для максимальной переносимости, хотя это и может показаться обременительным.
Точно так же, при использовании модуля AutoSplit, старайтесь придерживаться соглашений 8.3 по именованию и нечувствительности к регистру; или, по крайней мере, делайте так, чтобы получающиеся файлы имели уникальное (нечувствительное к регистру) начало из первых 8 символов.
Пробелы в именах файлов допускаются в большинстве систем, но не во всех, и даже в системах, где они могут допускаться, некоторые утилиты могут быть сбиты с толку такими пробелами.
Во многих системах (DOS, VMS ODS-2) в именах файлов не может быть более одного ..
Не предполагайте, что > не будет первым символом имени файла. Всегда используйте трёхаргументную версию open:
open my $fh, '<', $existing_file) or die $!; Двухаргументная open является магической и может переводить символы, такие как >, <, и | в именах файлов, что обычно является неправильным. sysopen и трёхаргументная open не имеют этой проблемы.
Не используйте : в качестве части имени файла, так как многие системы используют его для своих собственных целей (Mac OS Classic для разделения компонентов пути, многие сетевые схемы и утилиты для разделения имени узла и пути и т. д.). По тем же причинам избегайте @, ; и |.
Не предполагайте, что в именах путей можно объединить два ведущих слеша // в один: некоторые сетевые и кластерные файловые системы имеют особые семантики для этого. Позвольте операционной системе разобраться с этим.
Переносимые символы имен файлов, как определено в ANSI C:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
. _ - и - не должны быть первым символом. Если вы хотите быть предельно корректным, оставайтесь нечувствительными к регистру и придерживайтесь соглашения 8.3 об именовании (все файлы и каталоги должны быть уникальными внутри одного каталога, если их имена приводятся к нижнему регистру и обрезаются до восьми символов перед ., если таковые имеются, и до трёх символов после ., если таковые имеются). (И не используйте . в именах каталогов.)
Взаимодействие с системой
Не все платформы предоставляют командную строку. Это, как правило, платформы, которые в основном полагаются на графический пользовательский интерфейс (GUI) для взаимодействия с пользователем. Программа, требующая командной строки, может не работать везде. Вероятно, с этим должен разобраться пользователь программы, поэтому не стоит беспокоиться об этом.
Некоторые платформы не могут удалять или переименовывать файлы, которые открыты системой; это ограничение может также относиться к изменению метаданных файловой системы, таких как права доступа или владельцы файлов. Помните, что нужно close файлы, когда вы с ними закончили. Не unlink и не rename открытый файл. Не tie и не open файл, уже связанный или открытый; untie или close его сначала.
Не открывайте один и тот же файл более одного раза для записи, так как некоторые операционные системы вводят обязательные блокировки для таких файлов.
Не предполагайте, что разрешение на запись/изменение каталога даёт право на добавление или удаление файлов/каталогов в этом каталоге. Это специфично для файловой системы: в некоторых файловых системах вам также (или даже только) нужно разрешение на запись/изменение в самом файле/каталоге. В некоторых файловых системах (AFS, DFS) разрешение на добавление/удаление записей каталога — это совершенно отдельное разрешение.
Не предполагайте, что единственное unlink полностью удаляет файл: некоторые файловые системы (в первую очередь, системы VMS) имеют версионированные файлы, и unlink удаляет только последнюю версию (он не удаляет все версии, потому что по умолчанию средства нативных инструментов на этих платформах удаляют только последнюю версию). Переносимый способ удаления всех версий файла:
1 while unlink "file"; Это приведет к завершению, если файл по какой-либо причине не может быть удалён (защищён, отсутствует и так далее).
Не полагайтесь на существование конкретной переменной окружения в %ENV. Не полагайтесь на то, что записи в %ENV чувствительны к регистру или даже сохраняют регистр. Не пытайтесь очистить %ENV, сказав %ENV = ();, или, если вам действительно нужно, сделайте это условным от $^O ne 'VMS', поскольку в VMS таблица %ENV намного больше, чем таблица строк ключ-значение на процесс.
В VMS некоторые записи в хеше %ENV динамически создаются при чтении, если они ранее не существовали. Значения для $ENV{HOME}, $ENV{TERM}, $ENV{PATH}, и $ENV{USER}, известны как динамически генерируемые. Конкретные имена, которые генерируются динамически, могут меняться в зависимости от версии библиотеки C в VMS, и могут существовать другие, не документированные.
В VMS по умолчанию изменения в хеше %ENV сохраняются после завершения работы perl. Последующие вызовы perl в том же процессе могут непреднамеренно унаследовать параметры среды, которые должны были быть временными.
Не полагайтесь на сигналы или %SIG.
Не полагайтесь на подстановку имён файлов. Используйте opendir, readdir и closedir вместо этого.
Не полагайтесь на переменные среды или текущие каталоги для конкретной программы.
Не полагайтесь на конкретные значения $!, ни числовые, ни особенно строковые. Пользователи могут переключать свои языковые настройки, что приводит к тому, что сообщения об ошибках будут переведены на их языки. Если вы можете доверять POSIX-совместимой среде, то можно переносимо использовать символы, определённые модулем Errno, например, ENOENT. И не доверяйте значениям $! вообще, кроме как сразу после неудачного системного вызова.
Имена команд против имён файлов
Не предполагайте, что имя, используемое для вызова команды или программы с помощью system или exec, также может использоваться для проверки существования файла, содержащего исполняемый код этой команды или программы. Во-первых, многие системы имеют «внутренние» команды, встроенные в оболочку или ОС, и хотя эти команды можно вызывать, соответствующего файла нет. Во-вторых, некоторые операционные системы (например, Cygwin, OS/2 и VOS) имеют требуемые суффиксы для исполняемых файлов; эти суффиксы обычно разрешены для имени команды, но не требуются. Таким образом, команда, такая как perl может существовать в файле с именем perl, perl.exe или perl.pm в зависимости от операционной системы. Переменная $Config{_exe} в модуле Config содержит суффикс исполняемого файла, если таковой имеется. В-третьих, порт VMS тщательно настраивает $^X и $Config{perlpath} таким образом, что дальнейшая обработка не требуется. Это хорошо, так как соответствие регулярному выражению, используемому ниже, тогда должно будет обработать возможный заключительный номер версии в имени файла VMS.
Для преобразования $^X в имя файла с учётом требований различных операционных систем, скажем:
use Config;
my $thisperl = $^X;
if ($^O ne 'VMS') {
$thisperl .= $Config{_exe}
unless $thisperl =~ m/\Q$Config{_exe}\E$/i;
} Для преобразования $Config{perlpath} в имя файла, скажем:
use Config;
my $thisperl = $Config{perlpath};
if ($^O ne 'VMS') {
$thisperl .= $Config{_exe}
unless $thisperl =~ m/\Q$Config{_exe}\E$/i;
} Сеть
Не предполагайте, что вы можете получить доступ к общедоступному интернету.
Не предполагайте, что существует только один способ проникнуть через брандмауэры в общедоступный интернет.
Не предполагайте, что вы можете получить доступ к внешнему миру через любой порт, кроме 80, или через какой-либо веб-прокси. ftp заблокирован во многих брандмауэрах.
Не предполагайте, что вы можете отправлять электронные письма, подключившись к локальному SMTP-порту.
Не предполагайте, что вы можете связаться с собой или любым узлом по имени 'localhost'. То же самое относится к '127.0.0.1'. Вы должны попробовать оба варианта.
Не предполагайте, что у узла только одна сетевая карта или что он не может привязаться к множеству виртуальных IP-адресов.
Не предполагайте конкретного имени сетевого устройства.
Не предполагайте, что определённый набор ioctl будет работать.
Не предполагайте, что вы можете отправлять запросы ping на хосты и получать ответы.
Не предполагайте, что любой конкретный порт (служба) будет отвечать.
Не предполагайте, что Sys::Hostname (или любой другой API или команда) возвращает полное доменное имя или имя без доменной части: всё зависит от того, как была настроена система. Также помните, что в таких ситуациях, как DHCP и NAT, полученное доменное имя может быть не очень полезным.
Все перечисленные «не предполагайте» могут показаться сложными, и они таковыми и являются, но ключ в том, чтобы обеспечить плавную деградацию, если не удаётся получить доступ к конкретной сетевой службе, которая вам нужна. Выдача сообщений об ошибках или зависание не очень профессионально.
Взаимодействие между процессами (IPC)
В общем случае не обращайтесь напрямую к системе в коде, предназначенном для переноса. Это означает, что нет system, exec, fork, pipe, `` или qx//, open с |, ни чего другого, что делает хакера Perl ценным.
Команды, запускающие внешние процессы, обычно поддерживаются на большинстве платформ (хотя многие из них не поддерживают какой-либо тип разветвления). Проблема с их использованием возникает из-за того, на чём вы их используете. Внешние инструменты часто имеют разные имена на разных платформах, могут находиться в разных местах, принимать разные аргументы, вести себя по-разному и часто представлять свои результаты платформозависимым способом. Поэтому вы редко должны полагаться на них для получения согласованных результатов. (Впрочем, если вы вызываете netstat -a, вы, вероятно, не ожидаете, что она запустится как на Unix, так и на CP/M.)
Один особенно распространенный фрагмент кода Perl – это открытие канала для sendmail:
open(my $mail, '|-', '/usr/lib/sendmail -t')
or die "cannot fork sendmail: $!"; Это нормально для системного программирования, когда sendmail известен как доступный. Но это не нормально для многих систем, не являющихся Unix, и даже для некоторых систем Unix, на которых sendmail может быть не установлен. Если требуется переносимое решение, см. различные распределения на CPAN, которые обрабатывают это. Mail::Mailer и Mail::Send в распределении MailTools обычно используются и предоставляют несколько методов отправки почты, включая mail, sendmail, и прямой SMTP (через Net::SMTP), если агент передачи почты недоступен. Mail::Sendmail – это отдельный модуль, предоставляющий простую, независимую от платформы отправку почты.
Система V IPC (msg*(), sem*(), shm*()) недоступна даже на всех платформах Unix.
Не используйте ни результат pack("N", 10, 20, 30, 40), ни голые v-строки (например, v10.20.30.40) для представления адресов IPv4: обе формы просто упаковывают четыре байта в сетевом порядке. То, что это будет равно C-языковой структуре in_addr (которую использует код сокета внутри), не гарантируется. Для переноса используйте функции модуля Socket, такие как inet_aton, inet_ntoa и sockaddr_in.
Правило для переносимого кода: Делайте всё в переносимом Perl или используйте модуль (который может реализовывать его с помощью платформоспецифического кода, но предоставляет общий интерфейс).
Внешние подпрограммы (XS)
Код XS, как правило, можно заставить работать на любой платформе, но зависимые библиотеки, заголовочные файлы и т.д. могут быть недоступны или непереносимы, или сам код XS может быть платформоспецифичным, так же как и код Perl. Если библиотеки и заголовочные файлы переносимы, то обычно разумно убедиться, что код XS тоже переносимый.
Другой тип проблемы переноса возникает при написании кода XS: доступность компилятора C на системе конечного пользователя. C имеет свои проблемы переноса, и написание кода XS позволит вам столкнуться с некоторыми из них. Написание чистого кода Perl – более лёгкий способ достижения переноса.
Стандартные модули
В целом, стандартные модули работают на всех платформах. Заметные исключения – модуль CPAN (который в настоящее время устанавливает соединения с внешними программами, которые могут быть недоступны), платформоспецифические модули (например, ExtUtils::MM_VMS) и модули DBM.
Нет одного модуля DBM, доступного на всех платформах. SDBM_File и другие обычно доступны на всех Unix и DOS-совместимых портах, но не в MacPerl, где доступны только NDBM_File и DB_File.
Хорошая новость заключается в том, что по крайней мере какой-то модуль DBM должен быть доступен, и AnyDBM_File будет использовать тот модуль, который найдёт. Конечно, тогда код должен быть довольно строгим, уменьшаясь до наибольшего общего делителя (например, не превышая 1 КБ для каждой записи), чтобы он работал с любым модулем DBM. См. AnyDBM_File для получения дополнительной информации.
Время и дата
Понятие времени суток и даты в системе контролируется различными способами. Не предполагайте, что часовой пояс хранится в $ENV{TZ}, и даже если это так, не предполагайте, что вы можете управлять часовым поясом через эту переменную. Не предполагайте ничего о сокращениях часовых поясов из трёх букв (например, что MST будет часовым поясом Центрального стандартного времени, известно, что он может означать Московское стандартное время). Если вам нужно использовать часовые пояса, выразите их в каком-либо однозначном формате, например, точным числом минут, смещённых от UTC, или формате часового пояса POSIX.
Не предполагайте, что эпоха начинается в 00:00:00, 1 января 1970 года, поскольку это зависит от ОС и реализации. Лучше хранить дату в однозначном представлении. Стандарт ISO 8601 определяет формат даты YYYY-MM-DD или YYYY-MM-DDTHH:MM:SS (буквальное «T» отделяет дату от времени). Пожалуйста, используйте ISO 8601 вместо того, чтобы заставлять нас гадать, что может значить 02/03/04. ISO 8601 даже сортируется в порядке возрастания. Представление даты в текстовом формате (например, «1987-12-18») можно легко преобразовать в значение, специфичное для ОС, с помощью модуля, такого как Time::Piece (см. "Разбор дат" в Time::Piece) или Date::Parse. Массив значений, таких как те, что возвращаются функцией localtime, можно преобразовать в представление, специфичное для ОС, с помощью Time::Local.
При расчете определенных моментов времени, например, для тестов в модулях времени или дат, может быть целесообразно рассчитать смещение для эпохи.
use Time::Local qw(timegm);
my $offset = timegm(0, 0, 0, 1, 0, 1970); Значение $offset в Unix будет 0, но в Mac OS Classic будет каким-то большим числом. $offset можно затем добавить к значению Unix time, чтобы получить правильное значение в любой системе.
Наборы символов и кодировка символов
Предполагайте минимальное количество информации о наборах символов.
Не предполагайте ничего о числовых значениях (ord, chr) символов. Не используйте явные диапазоны кодовых точек (например, \xHH-\xHH)). Однако, начиная с Perl v5.22, диапазоны символьных классов в скобках в шаблонах регулярных выражений, указанные как qr/[\N{U+HH}-\N{U+HH}]/, являются переносимыми, а начиная с Perl v5.24, те же диапазоны являются переносимыми в tr///. Вы можете использовать символьные классы, такие как [:print:], переносимым образом.
Не предполагайте, что символы алфавита закодированы непрерывно (в числовом смысле). Возможны пробелы. Однако специальная кодировка в Perl гарантирует, что все подмножества qr/[A-Z]/, qr/[a-z]/, и qr/[0-9]/ ведут себя так, как ожидается. tr/// ведет себя одинаково для этих диапазонов. В шаблонах любые диапазоны, заданные конечными точками с использованием обозначений \N{...}, гарантируют переносимость наборов символов, но в Perl v5.22 это не верно для tr/// (ошибка исправлена в v5.24).
Не делайте предположений о порядке символов. Строчные буквы могут идти перед или после заглавных; строчные и заглавные могут быть перемежающимися, так что и «a», и «A» идут перед «b»; акцентированные и другие международные символы могут быть перемежающимися, так что «ä» идет перед «b». Для сортировки всего этого можно использовать Unicode::Collate.
Международная поддержка
Если вы можете предположить POSIX (достаточно большое предположение), вы можете узнать больше о системе локалей POSIX в разделе perllocale. Система локалей, по крайней мере, пытается сделать вещи немного более переносимыми, или по крайней мере более удобными и дружественными к пользователям, не использующим английский язык. Система влияет на наборы символов и кодировку, а также на форматирование дат и времени — среди прочего.
Если вы действительно хотите быть международными, вы должны рассмотреть Unicode. Подробнее см. в perluniintro и perlunicode.
По умолчанию Perl предполагает, что исходный код написан на 8-битной ASCII-надмножестве. Для вставки символов Unicode в строки и выражения регулярных выражений можно использовать обозначения \x{HH} или (более переносимо) \N{U+HH}. Вы также можете использовать прагму utf8 и писать код на UTF-8, что позволяет использовать символы Unicode напрямую (не только в скобках, но и в идентификаторах).
Системные ресурсы
Если ваш код предназначен для систем с сильно ограниченной (или отсутствующей!) виртуальной памятью, то вам необходимо особенно тщательно избегать таких расточительных конструкций, как:
my @lines = <$very_large_file>; # bad
while (<$fh>) {$file .= $_} # sometimes bad
my $file = join('', <$fh>); # better Две последние конструкции могут показаться неинтуитивными для большинства людей. Первая конструкция неоднократно увеличивает строку, а вторая выделяет большой блок памяти за один раз. На некоторых системах вторая конструкция более эффективна, чем первая.
Безопасность
Большинство многопользовательских платформ предоставляют базовые уровни безопасности, обычно реализованные на уровне файловой системы. Однако некоторые, к сожалению, этого не делают. Таким образом, понятие идентификатора пользователя, «домашней» директории или даже состояния входа в систему может быть не распознаваемым на многих платформах. Если вы пишете программы, которые уделяют внимание безопасности, обычно лучше знать тип системы, под которой вы будете работать, чтобы вы могли написать код, явно предназначенный для этой платформы (или класса платформ).
Не предполагайте семантики доступа к файловой системе Unix: операционная система или файловая система могут использовать некоторые системы управления доступом, которые являются более сложными, чем обычные rwx. Даже если rwx существуют, их семантика может отличаться.
(С точки зрения безопасности, проверка разрешений перед попыткой выполнения чего-либо бессмысленна: если это делается, возможны условия гонки. Кто-то или что-то может изменить разрешения между проверкой разрешений и фактической операцией. Просто попробуйте выполнить операцию.)
Не предполагайте семантики пользователей и групп Unix: особенно не ожидайте, что $< и $> (или $( и $)) будут работать для переключения идентичностей (или принадлежностей).
Не предполагайте семантики set-uid и set-gid. (И даже если вы это делаете, подумайте дважды: set-uid и set-gid — это известный источник проблем безопасности.)
Стиль
В тех случаях, когда необходимо использовать платформозависимый код, рекомендуется хранить платформозависимый код в одном месте, что упрощает перенос на другие платформы. Используйте модуль Config и специальную переменную $^O для различения платформ, как описано в разделе "PLATFORMS".
Будьте осторожны с «синдромом else»:
if ($^O eq 'MSWin32') {
# code that assumes Windows
} else {
# code that assumes Linux
} Ветвь else должна использоваться для действительно окончательного варианта, а не для кода, специфичного для какой-либо платформы.
Будьте осторожны с тестами, которые вы предоставляете со своим модулем или программами. Код модуля может быть полностью переносимым, но его тесты могут быть нет. Это часто происходит, когда тесты запускают другие процессы или вызывают внешние программы для помощи в тестировании, или когда (как отмечалось выше) тесты предполагают определенные вещи о файловой системе и путях. Будьте осторожны, не полагайтесь на определенный стиль вывода ошибок, например, при проверке $! после неудачного системного вызова. Использование $! для чего-либо кроме вывода сомнительно (хотя см. модуль Errno для тестирования значений ошибок достаточно переносимым образом). Некоторые платформы ожидают определенный формат вывода, и Perl на этих платформах может быть соответствующим образом настроен. В частности, не закрепляйте регулярное выражение при тестировании значения ошибки.
Тестировщики CPAN
Модули, загруженные в CPAN, тестируются различными добровольцами на разных платформах. Эти тестировщики CPAN уведомляются по электронной почте о каждом новом загружаемом модуле и отвечают в списке рассылки с ответами PASS, FAIL, NA (не применимо к данной платформе) или UNKNOWN (неизвестно), а также с любыми соответствующими примечаниями.
Цель тестирования двояка: во-первых, помочь разработчикам исправить любые проблемы в их коде, возникающие из-за недостатка тестирования на других платформах; во-вторых, предоставить пользователям информацию о том, работает ли данный модуль на данной платформе.
Также см.:
-
Список рассылки: cpan-testers-discuss@perl.org
-
Результаты тестирования: https://www.cpantesters.org/
ПЛАТФОРМЫ
Perl создается с переменной $^O, которая указывает на операционную систему, на которой он был создан. Это было сделано для ускорения кода, который в противном случае должен был бы use Config и использовать значение $Config{osname}. Конечно, для получения более подробной информации о системе рекомендуется изучить %Config.
%Config не всегда можно доверять, поскольку он был создан во время компиляции. Если perl был скомпилирован в одном месте, а затем передан в другое, некоторые значения могут быть неправильными. Значения могут быть изменены даже после факта.
Unix
Perl работает на удивительно разнообразных платформах Unix и Unix-подобных системах (см., например, большинство файлов в каталоге hints/ в наборе исходного кода). На большинстве этих систем значение $^O (следовательно, и $Config{osname}) определяется либо путем приведения первой строки строки, возвращаемой при вводе команды uname -a в командной строке, к нижнему регистру и удаления знаков препинания, либо путем проверки файловой системы на наличие файлов с уникальными именами, такими как ядро или заголовочный файл. Например, вот несколько популярных вариантов Unix:
uname $^O $Config{archname}
--------------------------------------------
AIX aix aix
BSD/OS bsdos i386-bsdos
Darwin darwin darwin
DYNIX/ptx dynixptx i386-dynixptx
FreeBSD freebsd freebsd-i386
Haiku haiku BePC-haiku
Linux linux arm-linux
Linux linux armv5tel-linux
Linux linux i386-linux
Linux linux i586-linux
Linux linux ppc-linux
HP-UX hpux PA-RISC1.1
IRIX irix irix
Mac OS X darwin darwin
NeXT 3 next next-fat
NeXT 4 next OPENSTEP-Mach
openbsd openbsd i386-openbsd
OSF1 dec_osf alpha-dec_osf
reliantunix-n svr4 RM400-svr4
SCO_SV sco_sv i386-sco_sv
SINIX-N svr4 RM400-svr4
sn4609 unicos CRAY_C90-unicos
sn6521 unicosmk t3e-unicosmk
sn9617 unicos CRAY_J90-unicos
SunOS solaris sun4-solaris
SunOS solaris i86pc-solaris
SunOS4 sunos sun4-sunos Поскольку значение $Config{archname} может зависеть от архитектуры оборудования, оно может изменяться больше, чем значение $^O.
DOS и производные
Perl давно портирован на микрокомпьютеры на базе Intel, работающие под системами типа PC-DOS, MS-DOS, OS/2 и большинстве платформ Windows, о которых вы можете упомянуть (кроме Windows CE, если считать ее таковой). Пользователи, знакомые со средами командной строки типа COMMAND.COM или CMD.EXE, должны знать, что у каждой из этих спецификаций файлов могут быть незначительные различия:
my $filespec0 = "c:/foo/bar/file.txt";
my $filespec1 = "c:\\foo\\bar\\file.txt";
my $filespec2 = 'c:\foo\bar\file.txt';
my $filespec3 = 'c:\\foo\\bar\\file.txt'; Системные вызовы принимают либо /, либо \ в качестве разделителя пути. Однако многие утилиты командной строки эпохи DOS рассматривают / как префикс опции, поэтому могут запутаться с именами файлов, содержащими /. Кроме вызова внешних программ, / будет работать хорошо, и, вероятно, лучше, так как это более согласуется с общепринятым использованием и избегает проблемы запоминания, что нужно пропустить, а что нет.
Файловая система DOS FAT может содержать только имена файлов в формате «8.3». В файловых системах HPFS (OS/2) и NTFS (NT), которые нечувствительны к регистру, но сохраняют регистр, вам нужно быть осторожным с регистром, возвращаемым функциями, такими как readdir, или используемыми с функциями, такими как open или opendir.
DOS также обрабатывает несколько имён файлов как специальные, такие как AUX, PRN, NUL, CON, COM1, LPT1, LPT2 и т. д. К сожалению, иногда эти имена файлов даже не будут работать, если вы включите явное префиксное указание каталога. Лучше избегать таких имён файлов, если вы хотите, чтобы ваш код был портативным для DOS и его производных. К сожалению, сложно знать, что всё это означает.
Пользователи этих операционных систем могут также захотеть использовать скрипты, такие как pl2bat.bat, для создания обёртки вокруг ваших скриптов.
Новая строка (\n) преобразуется в \015\012 системой ввода-вывода при чтении и записи файлов (см. "НовыеСтроки"). binmode($filehandle) будет сохранять \n в виде \012 для данного дескриптора файла. binmode всегда следует использовать для кода, который работает с двоичными данными. Это предполагает, что вы заранее осознаёте, что ваши данные двоичные. Программы общего назначения часто не должны делать никаких предположений о своих данных.
Переменная $^O и значения $Config{archname} для различных DOS-подобных Perl интерпретаторов приведены ниже:
OS $^O $Config{archname} ID Version
---------------------------------------------------------
MS-DOS dos ?
PC-DOS dos ?
OS/2 os2 ?
Windows 3.1 ? ? 0 3 01
Windows 95 MSWin32 MSWin32-x86 1 4 00
Windows 98 MSWin32 MSWin32-x86 1 4 10
Windows ME MSWin32 MSWin32-x86 1 ?
Windows NT MSWin32 MSWin32-x86 2 4 xx
Windows NT MSWin32 MSWin32-ALPHA 2 4 xx
Windows NT MSWin32 MSWin32-ppc 2 4 xx
Windows 2000 MSWin32 MSWin32-x86 2 5 00
Windows XP MSWin32 MSWin32-x86 2 5 01
Windows 2003 MSWin32 MSWin32-x86 2 5 02
Windows Vista MSWin32 MSWin32-x86 2 6 00
Windows 7 MSWin32 MSWin32-x86 2 6 01
Windows 7 MSWin32 MSWin32-x64 2 6 01
Windows 2008 MSWin32 MSWin32-x86 2 6 01
Windows 2008 MSWin32 MSWin32-x64 2 6 01
Windows CE MSWin32 ? 3
Cygwin cygwin cygwin Различные Perl-интерпретаторы для MSWin32 могут различать ОС, на которой они работают, по значению пятого элемента списка, возвращаемого Win32::GetOSVersion(). Например:
if ($^O eq 'MSWin32') {
my @os_version_info = Win32::GetOSVersion();
print +('3.1','95','NT')[$os_version_info[4]],"\n";
} Также существуют Win32::IsWinNT()|Win32/Win32::IsWinNT(), Win32::IsWin95()|Win32/Win32::IsWin95(), и Win32::GetOSName(); попробуйте perldoc Win32. Очень портативная функция POSIX::uname() также будет работать:
c:\> perl -MPOSIX -we "print join '|', uname"
Windows NT|moonru|5.0|Build 2195 (Service Pack 2)|x86 Ошибки, задаваемые функциями Winsock, теперь непосредственно записываются в $^E, а соответствующие коды ошибок WSAE* теперь экспортируются из модулей Errno и POSIX для проверки на их соответствие.
Предыдущее поведение, заключающееся в записи ошибок (преобразованных в коды ошибок в стиле POSIX E* с Perl 5.20.0) в $!, было некорректным из-за неэквивалентности одноимённых констант ошибок Winsock и POSIX, а отношение между которыми к сожалению было установлено каким-либо образом с Perl 5.8.0.
Новое поведение предоставляет гораздо более надёжное решение для проверки ошибок Winsock в портативном программном обеспечении, не случайно сравнивая тесты POSIX, предназначенные для других ОС, которые могут иметь иное значение для Winsock.
Старое поведение в настоящее время сохранено, со всеми его недостатками, для обратной совместимости, но пользователям рекомендуется изменить любой код, который проверяет $! на E* константы для ошибок Winsock, чтобы вместо этого проверять $^E на WSAE* константы. После соответствующего периода устаревания, начавшегося с Perl 5.24, старое поведение может быть удалено, оставляя $! неизменным после вызова функций Winsock, чтобы избежать возможной путаницы относительно того, какую переменную ошибки проверять.
См. также:
-
Среда EMX для DOS, OS/2 и т. д. emx@iaehv.nl, ftp://hobbes.nmsu.edu/pub/os2/dev/emx/ Также perlos2.
-
Инструкции по сборке для Win32 в perlwin32 или в среде Cygnus в perlcygwin.
-
Модули
Win32::*в Win32. -
Страницы ActiveState, https://www.activestate.com/
-
Среда Cygwin для Win32; README.cygwin (установлено как perlcygwin), https://www.cygwin.com/
-
Инструкции по сборке для OS/2, perlos2
VMS
Perl на VMS описан в perlvms в дистрибутиве Perl.
Официальное название VMS на момент написания этой статьи — OpenVMS.
Взаимодействие с Perl из оболочки команд Digital Command Language (DCL) часто требует других кавычек, чем оболочки Unix. Например:
$ perl -e "print ""Hello, world.\n"""
Hello, world. Существует несколько способов обернуть ваши Perl-скрипты в файлы DCL .COM, если вы этого пожелаете. Например:
$ write sys$output "Hello from DCL!"
$ if p1 .eqs. ""
$ then perl -x 'f$environment("PROCEDURE")
$ else perl -x - 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8
$ deck/dollars="__END__"
#!/usr/bin/perl
print "Hello from Perl!\n";
__END__
$ endif Будьте осторожны с $ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT, если ваш Perl-скрипт в DCL ожидает выполнить такие действия, как $read = <STDIN>;.
Операционная система VMS имеет две файловые системы, определяемые уровнем их структуры на диске (ODS): ODS-2 и ее преемник ODS-5. Первоначальный порт Perl на VMS предшествует ODS-5, но все текущие тесты и разработки предполагают ODS-5 и его возможности, включая сохранение регистра, расширенных символов в именах файлов и имён длиной до 8192 байтов.
Perl на VMS может принимать спецификации имен файлов в формате VMS или Unix, как в одном из следующих вариантов:
$ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM
$ perl -ne "print if /perl_setup/i" /sys$login/login.com но не их смесь, как в:
$ perl -ne "print if /perl_setup/i" sys$login:/login.com
Can't open sys$login:/login.com: file specification syntax error В общем случае, самый простой путь к портативности — всегда указывать имена файлов в формате Unix, если они не будут обрабатываться средствами или утилитами нативного формата. Из-за этого последнего соображения, модуль File::Spec по умолчанию возвращает спецификации в нативном формате независимо от входного формата. Этот параметр можно перевернуть, чтобы имена файлов всегда отображались в формате Unix, задав логическое значение функции DECC$FILENAME_UNIX_REPORT в среде.
Тип файла или расширение всегда присутствует в спецификации имени файла в формате VMS, даже если оно нулевой длины. Это означает, что по умолчанию readdir вернёт конечную точку с точкой для файла без расширения, поэтому там, где вы увидите "a" в Unix, вы увидите "a." на VMS. Однако конечную точку можно подавить, включив функцию DECC$READDIR_DROPDOTNOTYPE в среде (см. документацию CRTL по логическим именам функций).
То, что представляет \n, зависит от типа открытого файла. Обычно он представляет \012, но также может представлять \015, \012, \015\012, \000, \040, или ничего в зависимости от организации файла и формата записей. Модуль VMS::Stdio предоставляет доступ к особым требованиям fopen() файлов с необычными атрибутами на VMS.
Значение $^O в OpenVMS равно "VMS". Чтобы определить архитектуру, на которой вы работаете, обратитесь к $Config{archname}.
В VMS perl определяет смещение UTC по логическому имени SYS$TIMEZONE_DIFFERENTIAL. Хотя эра VMS началась 17-НОЯ-1858 00:00:00.00, вызовы localtime корректируются для подсчёта смещений с 01-ЯНВ-1970 00:00:00.00, как и в Unix.
См. также:
-
README.vms (установлено как README_vms), perlvms
-
Список рассылки vmsperl, vmsperl-subscribe@perl.org
-
vmsperl в сети, http://www.sidhe.org/vmsperl/index.html
-
Веб-сайт VMS Software Inc., http://www.vmssoftware.com
VOS
Perl на VOS (также известный как OpenVOS) обсуждается в README.vos в дистрибутиве Perl (установлено как perlvos). Perl на VOS может принимать спецификации имен файлов в формате VOS или Unix, как в одном из следующих вариантов:
$ perl -ne "print if /perl_setup/i" >system>notices
$ perl -ne "print if /perl_setup/i" /system/notices или даже их смесь, как в:
$ perl -ne "print if /perl_setup/i" >system/notices Несмотря на то, что символ слеша может появляться в именах объектов VOS, так как порт Perl для VOS интерпретирует его как разделитель пути, файлы, каталоги или ссылки VOS, имена которых содержат символ слеша, не могут быть обработаны. Такие файлы должны быть переименованы, прежде чем они смогут быть обработаны Perl.
Более ранние версии VOS (до OpenVOS Release 17.0) ограничивают имена файлов 32 или менее символами, запрещают имена файлов, начинающиеся с символа -, и запрещают имена файлов, содержащие пробелы (space) или любой символ из набора !#%&'()*;<=>?.
Более новые версии VOS (OpenVOS Release 17.0 и новее) поддерживают функцию расширенных имён. В этих версиях имена файлов могут содержать до 255 символов, запрещено начинать с символа -, а набор запрещённых символов сокращён до #%*<>?. Существуют ограничения, связанные с пробелами и апострофами: эти символы не могут начинаться и заканчиваться именем, а также не могут непосредственно предшествовать или следовать за точкой. Кроме того, пробел не может непосредственно предшествовать другому пробелу или тире. Конкретно, запрещены следующие комбинации символов: пробел-пробел, пробел-тире, точка-пробел, пробел-точка, точка-апостроф, апостроф-точка, ведущий или заключительный пробел и ведущий или заключительный апостроф. Хотя расширенное имя файла ограничено 255 символами, имя пути всё ещё ограничено 256 символами.
Значение $^O в VOS равно "vos". Чтобы определить архитектуру, на которой вы работаете, обратитесь к $Config{archname}.
См. также:
-
README.vos (установлено как perlvos)
-
Список рассылки VOS.
Нет конкретного списка рассылки для Perl на VOS. Вы можете связаться с Центром поддержки клиентов Stratus Technologies (CAC) для вашего региона, или вы можете использовать контактную информацию, расположенную в файлах дистрибутива на анонимном FTP-сервере Stratus.
-
Stratus Technologies в сети http://www.stratus.com
-
VOS Open-Source Software в сети http://ftp.stratus.com/pub/vos/vos.html
EBCDIC-платформы
Основной Perl v5.22 работает на z/OS (ранее OS/390). Теоретически он мог бы работать на преемниках OS/400 на AS/400 мини-компьютерах, а также на VM/ESA и BS2000 для S/390 мейнфреймов. Такие компьютеры используют внутренне кодовые наборы EBCDIC (обычно кодовый набор символов ID 0037 для OS/400 и либо 1047, либо POSIX-BC для систем S/390).
Остальная часть этого раздела может потребовать обновления, но мы не знаем, что должно быть написано. Пожалуйста, отправляйте комментарии на https://github.com/Perl/perl5/issues.
На мейнфреймах Perl в настоящее время работает в рамках «Unix системных служб для OS/390» (ранее известный как OpenEdition), VM/ESA OpenEdition или системы BS200 POSIX-BC (BS2000 поддерживается в Perl 5.6 и выше). См. perlos390 для подробностей. Обратите внимание, что для OS/400 также есть порт Perl 5.8.1/5.10.0 или более поздних версий в PASE, который использует ASCII (в отличие от ILE, который использует EBCDIC), см. perlos400.
Начиная с R2.5 USS для OS/390 и версии 2.3 VM/ESA эти подсистемы Unix не поддерживают трюк #! shebang для вызова скрипта. Следовательно, на OS/390 и VM/ESA Perl-скрипты могут быть выполнены с заголовком, подобным следующему простому скрипту:
: # use perl
eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
if 0;
#!/usr/local/bin/perl # just a comment really
print "Hello from perl!\n"; OS/390 будет поддерживать трюк #! shebang с версии 2.8 и выше. Вызовы system и обратные кавычки могут использовать синтаксис оболочки POSIX на всех системах S/390.
На AS/400, если PERL5 находится в вашем списке библиотек, вам может потребоваться обернуть ваши Perl-скрипты в процедуру CL для их вызова следующим образом:
BEGIN
CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl')
ENDPGM Это вызовет скрипт Perl hello.pl в корне файловой системы QOpenSys. В вызовах AS/400 к system или обратным кавычкам необходимо использовать синтаксис CL.
На этих платформах имейте в виду, что кодировка EBCDIC может повлиять на работу некоторых функций Perl (таких как chr, pack, print, printf, ord, sort, sprintf, unpack), а также на работу с битами ASCII-констант с помощью операторов, таких как ^, & и |, не говоря уже о работе с сокетами для ASCII-компьютеров (см. "Новые строки").
К счастью, большинство веб-серверов для мэйнфреймов корректно преобразуют \n в следующем операторе в его ASCII-эквивалент (\r одинаково в Unix и z/OS):
print "Content-type: text/html\r\n\r\n"; Значения $^O на некоторых из этих платформ включают:
uname $^O $Config{archname}
--------------------------------------------
OS/390 os390 os390
OS400 os400 os400
POSIX-BC posix-bc BS2000-posix-bc Некоторые простые способы определения работы на платформе EBCDIC могут включать любой из следующих пунктов (возможно, все):
if ("\t" eq "\005") { print "EBCDIC may be spoken here!\n"; }
if (ord('A') == 193) { print "EBCDIC may be spoken here!\n"; }
if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; } Не стоит полагаться на кодировку EBCDIC для знаков препинания, так как они могут отличаться от кодовой страницы к кодовой странице (и после того, как ваш модуль или скрипт начнёт работать с EBCDIC, люди захотят, чтобы он работал со всеми кодовыми страницами EBCDIC).
См. также:
-
Список рассылки perl-mvs@perl.org предназначен для обсуждения проблем портирования, а также общих вопросов использования для всех Perl-версий с EBCDIC. Отправьте сообщение с телом «subscribe perl-mvs» на majordomo@perl.org.
-
Информация о Perl для AS/400 по адресу http://as400.rochester.ibm.com/, а также в каталоге ports/ на CPAN.
Acorn RISC OS
Поскольку Acorn используют ASCII с символами новой строки (\n) в текстовых файлах, как и Unix, и так как эмуляция имен файлов Unix включена по умолчанию, большинство простых скриптов, скорее всего, будут работать «из коробки». Родная файловая система модульная, и отдельные файловые системы могут быть регистрозависимыми или регистронезависимыми и обычно сохраняют регистр. Некоторые родные файловые системы имеют ограничения на длину имен, при этом имена файлов и каталогов молча обрезаются до подходящего размера. Скрипты должны учитывать, что стандартная файловая система в настоящее время имеет ограничение на длину имени в 10 символов, с максимальным количеством 77 элементов в каталоге, но другие файловые системы могут не накладывать таких ограничений.
Родные имена файлов имеют вид
Filesystem#Special_Field::DiskName.$.Directory.Directory.File где
Special_Field is not usually present, but may contain . and $ .
Filesystem =~ m|[A-Za-z0-9_]|
DsicName =~ m|[A-Za-z0-9_/]|
$ represents the root directory
. is the path separator
@ is the current directory (per filesystem but machine global)
^ is the parent directory
Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+| Преобразование имён файлов по умолчанию примерно tr|/.|./|, заменяя точки и косые черты.
Обратите внимание, что "ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File' и что второй этап интерполяции $ в регулярных выражениях может столкнуться с переменной $., если скрипты не будут осторожны.
Также допускаются логические пути, указанные в переменных системы, содержащих разделенные запятыми списки поиска; таким образом, System:Modules — это допустимое имя файла, и файловая система будет добавлять Modules к каждому разделу System$Path до тех пор, пока имя не укажет на объект на диске. Запись в новый файл System:Modules будет разрешена только в том случае, если System$Path содержит список из одного элемента. Файловая система также будет расширять переменные системы в именах файлов, если они заключены в угловые скобки, поэтому <System$Dir>.Modules будет искать файл $ENV{'System$Dir'} . 'Modules'. Очевидным следствием этого является то, что **полные имена файлов могут начинаться с <>**, и всегда следует использовать трёхаргументную форму open.
Поскольку . использовался в качестве разделителя каталогов, и нельзя было гарантировать уникальность имён файлов после 10 символов, Acorn реализовали компилятор C, чтобы удалять из имён файлов указанные в исходном коде суффиксы .c .h .s и .o, и сохранять соответствующие файлы в подкаталогах, названных в соответствии с суффиксом. Таким образом, файлы преобразуются:
foo.h h.foo
C:foo.h C:h.foo (logical path variable)
sys/os.h sys.h.os (C compiler groks Unix-speak)
10charname.c c.10charname
10charname.o o.10charname
11charname_.c c.11charname (assuming filesystem truncates at 10) Трансляция имён файлов в родной формат библиотекой эмуляции Unix предполагает, что такой перевод необходим, и она позволяет использовать пользовательский список известных суффиксов, которые будут преобразованы таким образом. Это может показаться прозрачным, но имейте в виду, что согласно этим правилам foo/bar/baz.h и foo/bar/h/baz оба отображаются в foo.bar.h.baz, и что readdir и glob не могут и не пытаются выполнить обратное отображение. Другие . в именах файлов преобразуются в /.
Как подразумевается выше, доступ к окружению через %ENV является глобальным, и соглашение состоит в том, что переменные среды, специфичные для программы, имеют вид Program$Name. Каждая файловая система поддерживает текущий каталог, и текущий каталог текущей файловой системы — это **глобальный** текущий каталог. Следовательно, дружественные программы не изменяют текущий каталог, а полагаются на полные имена путей, и программы (и Makefiles) не могут предполагать, что они могут запустить дочерний процесс, который может изменить текущий каталог без влияния на родительский (и всех остальных).
Поскольку дескрипторы файлов родной операционной системы являются глобальными и в настоящее время выделены до 255, причём 0 — зарезервированное значение, библиотека эмуляции Unix эмулирует дескрипторы файлов Unix. Следовательно, вы не можете полагаться на передачу STDIN, STDOUT, или STDERR своим дочерним процессам.
Желание пользователей выразить имена файлов в формате <Foo$Dir>.Bar в командной строке без кавычек тоже создаёт проблемы: захват командного вывода `` должен выполнять угадывание. Предполагается, что строка <[^<>]+\$[^<>]> относится к переменной среды, а всё остальное, что включает < или >, представляет собой перенаправление и, как правило, угадывает правильно в 99% случаев. Конечно, проблема остаётся в том, что скрипты не могут полагаться на доступность каких-либо утилит Unix или на то, что найденные утилиты имеют аргументы командной строки типа Unix.
Расширения и XS, теоретически, могут быть скомпилированы любым пользователем с использованием бесплатных инструментов. На практике многие не делают этого, поскольку пользователи платформы Acorn привыкли к двоичным дистрибутивам. MakeMaker работает, но ни один из доступных make-файлов не справляется с make-файлами MakeMaker; даже если и когда это будет исправлено, отсутствие оболочки типа Unix приведёт к проблемам с правилами make-файла, особенно с строками вида cd sdbm && make all, и всем, что использует кавычки.
"RISC OS" — это правильное название операционной системы, но значение в $^O — «riscos» (потому что нам не нравится кричать).
Другие Perl
Perl был перенесён на многие платформы, не входящие ни в одну из вышеперечисленных категорий. Некоторые, такие как AmigaOS, QNX, Plan 9 и VOS, хорошо интегрированы в стандартный набор исходного кода Perl. Возможно, вам потребуется обратиться к каталогу ports/ на CPAN за информацией и, возможно, двоичными файлами, для таких платформ, как: aos, Atari ST, lynxos, riscos, Novell Netware, Tandem Guardian и т.д. (Да, мы знаем, что некоторые из этих ОС могут относиться к категории Unix, но мы не являемся органом по стандартизации).
Некоторые приблизительные имена операционных систем и их значения $^O в категории «OTHER» включают:
OS $^O $Config{archname}
------------------------------------------
Amiga DOS amigaos m68k-amigos См. также:
-
Amiga, README.amiga (установлен как perlamiga).
-
Plan 9, README.plan9
РЕАЛИЗАЦИИ ФУНКЦИЙ
Ниже перечислены функции, которые либо полностью не реализованы, либо реализованы по-разному на разных платформах. Перед каждым описанием будет список платформ, к которым относится это описание.
Список может быть неполным или даже неправильным в некоторых местах. В случае сомнений обратитесь к файлам README для конкретной платформы в дистрибутиве Perl и любым другим документам, прилагаемым к данному порту.
Кроме того, даже среди Unix-подобных систем существуют вариации.
Для многих функций вы также можете получить информацию из %Config, экспортируемой по умолчанию модулем Config. Например, чтобы проверить, поддерживается ли вызовом lstat на данной платформе, обратитесь к $Config{d_lstat}. См. Конфигурация для полного описания доступных переменных.
Алфавитный список функций Perl
- -X
-
(Win32)
-wтолько проверяет атрибут файла только для чтения (FILE_ATTRIBUTE_READONLY), который определяет, может ли каталог быть удалён, а не может ли он быть записан. Каталоги всегда имеют права чтения и записи, если не запрещено правилами контроля доступа (DACL).(VMS)
-r,-w,-x, и-oпоказывают, доступен ли файл, что может не отражать защиты файла на основе UIC.(RISC OS)
-sпо имени открытого файла вернёт зарезервированное на диске пространство, а не текущий объём.-sдля открытого дескриптора файла возвращает текущий размер.(Win32, VMS, RISC OS)
-R,-W,-X,-Oнеотличимы от-r,-w,-x,-o.(Win32, VMS, RISC OS)
-g,-k,-l,-u,-Aне имеют особого смысла.(Win32)
-lвозвращает true как для символических ссылок, так и для каталожных соединений.(VMS, RISC OS)
-pне имеет особого смысла.(VMS)
-dистинно, если в качестве аргумента передан спецификатор устройства без явного каталога.(Win32)
-x(или-X) определяют, заканчивается ли файл одним из исполняемых суффиксов.-Sне имеет смысла.(RISC OS)
-x(или-X) определяют, имеет ли файл тип исполняемого файла. - alarm
-
(Win32) Эмулируется с помощью таймеров, которые должны быть явно опрошены всякий раз, когда Perl хочет отправить «безопасные сигналы», и поэтому не могут прерывать блокирующие системные вызовы.
- atan2
-
(Tru64, HP-UX 10.20) Из-за проблем с различными процессорами, математическими библиотеками, компиляторами и стандартами, результаты для
atan2могут варьироваться в зависимости от любой комбинации вышеперечисленного. Perl пытается соответствовать стандартам Open Group/IEEE для результатов, возвращаемыхatan2, но не может повлиять на результат, если система, на которой выполняется Perl, этого не позволяет.Текущая версия стандартов для
atan2доступна по адресу http://www.opengroup.org/onlinepubs/009695399/functions/atan2.html. - binmode
-
(RISC OS) Не имеет смысла.
(VMS) Переоткрывает файл и восстанавливает указатель; если функция завершается неудачно, базовый дескриптор файла может быть закрыт, или указатель может быть в другом положении.
(Win32) Значение, возвращаемое
tell, может измениться после вызова, и дескриптор файла может быть очищен. - chdir
-
(Win32) Текущий каталог, сообщаемый системой, может включать все символические ссылки, указанные в chdir().
- chmod
-
(Win32) Только для изменения доступа «владельца» чтение/запись; биты «группы» и «другие» не имеют смысла.
(RISC OS) Только для изменения доступа «владельца» и «другие» чтение/запись.
(VOS) Права доступа отображаются на изменения списка контроля доступа VOS.
(Cygwin) Фактические установленные права зависят от значения переменной
CYGWINв системных настройках среды.(Android) Установка бита exec в некоторых местах (как правило, /sdcard) вернёт true, но не установит бит.
(VMS) Аргумент режима со значением ноль устанавливает права доступа к значению маски разрешений по умолчанию пользователя, а не отключает все разрешения.
- chown
-
(Plan 9, RISC OS) Не реализовано.
(Win32) Ничего не делает, но не завершается ошибкой.
(VOS) Немного необычно, потому что понятие владения в VOS немного необычно.
- chroot
-
(Win32, VMS, Plan 9, RISC OS, VOS) Не реализовано.
- crypt
-
(Win32) Может быть недоступен, если библиотека или исходный код не были предоставлены при компиляции Perl.
(Android) Не реализовано.
- dbmclose
-
(VMS, Plan 9, VOS) Не реализовано.
- dbmopen
-
(VMS, Plan 9, VOS) Не реализовано.
- dump
-
(RISC OS) Не полезно.
(Cygwin, Win32) Не поддерживается.
(VMS) Вызывает отладчик VMS.
- exec
-
(Win32)
exec LISTбез использования синтаксиса косвенного объекта (exec PROGRAM LIST) может вернуться к попытке использования оболочки, если перваяspawn()завершится неудачно.Обратите внимание, что форма exec() с перечислением эмулируется, поскольку API Win32 CreateProcess() принимает простую строку, а не массив аргументов командной строки. Это может иметь последствия для безопасности вашего кода.
(SunOS, Solaris, HP-UX) Не автоматически очищает обработчики вывода на некоторых платформах.
- exit
-
(VMS) Эмулирует Unix
exit(который считаетexit 1указанием ошибки) путём сопоставления1сSS$_ABORT(44). Это поведение можно переопределить с помощью псевдонимаuse vmsish 'exit'. Как и функция CRTLexit(),exit 0также сопоставляется со статусом выходаSS$_NORMAL(1); это сопоставление нельзя переопределить. Любой другой аргументexitиспользуется непосредственно в качестве статуса выхода Perl. В VMS, если не включен режим POSIX_EXIT, код выхода всегда должен быть действительным кодом выхода VMS, а не общим числом. Когда режим POSIX_EXIT включён, общее число будет закодировано способом, совместимым с макросом C-библиотеки _POSIX_EXIT, чтобы его можно было декодировать другими программами, особенно написанными на C, такими как пакет GNV.(Solaris)
exitсбрасывает указатели файлов, что является проблемой при вызове из дочернего процесса (созданногоfork) вBEGIN. Обходной путь заключается в использованииPOSIX::_exit.exit unless $Config{archname} =~ /\bsolaris\b/; require POSIX; POSIX::_exit(0); - fcntl
-
(Win32) Не реализовано.
(VMS) Некоторые функции доступны в зависимости от версии VMS.
- flock
-
(VMS, RISC OS, VOS) Не реализовано.
- fork
-
(AmigaOS, RISC OS, VMS) Не реализовано.
(Win32) Эмулируется с помощью нескольких интерпретаторов. См. perlfork.
(SunOS, Solaris, HP-UX) Не автоматически очищает обработчики вывода на некоторых платформах.
- getlogin
-
(RISC OS) Не реализовано.
- getpgrp
-
(Win32, VMS, RISC OS) Не реализовано.
- getppid
-
(Win32, RISC OS) Не реализовано.
- getpriority
-
(Win32, VMS, RISC OS, VOS) Не реализовано.
- getpwnam
-
(Win32) Не реализовано.
(RISC OS) Не полезно.
- getgrnam
-
(Win32, VMS, RISC OS) Не реализовано.
- getnetbyname
-
(Android, Win32, Plan 9) Не реализовано.
- getpwuid
-
(Win32) Не реализовано.
(RISC OS) Не полезно.
- getgrgid
-
(Win32, VMS, RISC OS) Не реализовано.
- getnetbyaddr
-
(Android, Win32, Plan 9) Не реализовано.
- getprotobynumber
-
(Android) Не реализовано.
- getpwent
-
(Android, Win32) Не реализовано.
- getgrent
-
(Android, Win32, VMS) Не реализовано.
- gethostbyname
-
(Irix 5)
gethostbyname('localhost')не работает везде: возможно, вам придётся использоватьgethostbyname('127.0.0.1'). - gethostent
-
(Win32) Не реализовано.
- getnetent
-
(Android, Win32, Plan 9) Не реализовано.
- getprotoent
-
(Android, Win32, Plan 9) Не реализовано.
- getservent
-
(Win32, Plan 9) Не реализовано.
- seekdir
-
(Android) Не реализовано.
- sethostent
-
(Android, Win32, Plan 9, RISC OS) Не реализовано.
- setnetent
-
(Win32, Plan 9, RISC OS) Не реализовано.
- setprotoent
-
(Android, Win32, Plan 9, RISC OS) Не реализовано.
- setservent
-
(Plan 9, Win32, RISC OS) Не реализовано.
- endpwent
-
(Win32) Не реализовано.
(Android) Либо не реализовано, либо является пустой операцией.
- endgrent
-
(Android, RISC OS, VMS, Win32) Не реализовано.
- endhostent
-
(Android, Win32) Не реализовано.
- endnetent
-
(Android, Win32, Plan 9) Не реализовано.
- endprotoent
-
(Android, Win32, Plan 9) Не реализовано.
- endservent
-
(Plan 9, Win32) Не реализовано.
- getsockopt
-
(Plan 9) Не реализовано.
- glob
-
Этот оператор реализован с помощью расширения
File::Globна большинстве платформ. Смотрите File::Glob для информации о переносимости. - gmtime
-
По теории,
gmtimeнадёжен в диапазоне от -2**63 до 2**63-1. Однако, из-за использования в реализации обходных путей с плавающей точкой, точность будет теряться по мере увеличения времени. Это ошибка, которая будет исправлена в будущем.(VOS) Значения времени — 32-битные величины.
- ioctl
-
(VMS) Не реализовано.
(Win32) Доступно только для дескрипторов сокетов, и выполняет то же, что и вызов
ioctlsocket()в API Winsock.(RISC OS) Доступно только для дескрипторов сокетов.
- kill
-
(RISC OS) Не реализовано, поэтому не пригодно для проверки заражения.
(Win32)
killне отправляет сигнал в идентифицированный процесс, как на платформах Unix. Вместо этогоkill($sig, $pid)завершает процесс, идентифицированный значением$pid, и заставляет его немедленно завершиться со статусом выхода$sig. Как и в Unix, если$sigравно 0, и указанный процесс существует, он возвращает true, не завершая его.(Win32)
kill(-9, $pid)завершит процесс, указанный значением$pid, и все дочерние процессы, которыми он владеет рекурсивно. Это отличается от семантики Unix, где сигнал будет доставлен всем процессам в той же группе процессов, что и процесс, указанный значением$pid.(VMS) В настоящее время не поддерживается pid со значением -1, обозначающим все процессы в системе.
- link
-
(RISC OS, VOS) Не реализовано.
(AmigaOS) Счётчик ссылок не обновляется, так как жёсткие ссылки не совсем жёсткие (они находятся где-то между жёсткими и мягкими ссылками).
(Win32) Жёсткие ссылки реализованы в Win32 под NTFS только. Они изначально поддерживаются в Windows 2000 и более поздних версиях. В Windows NT они реализованы с использованием поддержки подсистемы Windows POSIX, и Perl-процесс потребует привилегий администратора или оператора резервного копирования для создания жёстких ссылок.
(VMS) Доступно в 64-битной OpenVMS 8.2 и более поздних версиях.
- localtime
-
localtimeимеет тот же диапазон, что и "gmtime", но из-за изменений правил часовых поясов, его точность для исторических и будущих времен может снизиться, но обычно не более чем на один час. - lstat
-
(RISC OS) Не реализовано.
(Win32) Обрабатывает соединения каталогов как символьные ссылки.
- msgctl
- msgget
- msgsnd
- msgrcv
-
(Android, Win32, VMS, Plan 9, RISC OS, VOS) Не реализовано.
- open
-
(RISC OS) Режимы открытия
|-и-|не поддерживаются.(SunOS, Solaris, HP-UX) Открытие процесса не гарантирует автоматического сброса выходных каналов на некоторых платформах.
(Win32) Оба режима
|-и-|поддерживаются, но список имитируется, так как Win32 API CreateProcess() принимает простую строку, а не массив аргументов. Это может иметь последствия для безопасности вашего кода. - readlink
-
(VMS, RISC OS) Не реализовано.
(Win32) readlink() для соединения каталога возвращает имя объекта, а не просто путь.
- rename
-
(Win32) Нельзя перемещать каталоги между каталогами на разных логических томах.
- rewinddir
-
(Win32) Не заставит
readdirперечитать поток каталога. Записи, прочитанные до вызоваrewinddir, будут просто возвращены из кэшированного буфера. - select
-
(Win32, VMS) Реализовано только для сокетов.
(RISC OS) Надёжно только для сокетов.
Обратите внимание, что форма
select FILEHANDLEобычно портативна. - semctl
- semget
- semop
-
(Android, Win32, VMS, RISC OS) Не реализовано.
- setgrent
-
(Android, VMS, Win32, RISC OS) Не реализовано.
- setpgrp
-
(Win32, VMS, RISC OS, VOS) Не реализовано.
- setpriority
-
(Win32, VMS, RISC OS, VOS) Не реализовано.
- setpwent
-
(Android, Win32, RISC OS) Не реализовано.
- setsockopt
-
(Plan 9) Не реализовано.
- shmctl
- shmget
- shmread
- shmwrite
-
(Android, Win32, VMS, RISC OS) Не реализовано.
- sleep
-
(Win32) Эмулируется с использованием функций синхронизации таким образом, что его можно прервать с помощью
alarm, и ограничено максимумом в 4294967 секунд, примерно 49 дней. - socketpair
-
(RISC OS) Не реализовано.
(VMS) Доступно в 64-битной OpenVMS 8.2 и более поздних версиях.
- stat
-
Платформы, не имеющие
rdev,blksize, илиblocks, вернут их как'', поэтому числовые сравнения или манипуляции с этими полями могут вызвать предупреждения "не число" (not numeric).(Mac OS X)
ctimeне поддерживается в UFS.(Win32)
ctime— время создания, а не время изменения индекса.(VMS)
devиinoне обязательно надёжны.(RISC OS)
mtime,atimeиctimeвсе возвращают последнее время изменения.devиinoне обязательно надёжны.(OS/2)
dev,rdev,blksize, иblocksнедоступны.inoне имеет смысла и будет отличаться между вызовами stat для одного и того же файла.(Cygwin) Некоторые версии cygwin при выполнении
stat("foo")и отсутствии файла могут попытатьсяstat("foo.exe"). - symlink
-
(RISC OS) Не реализовано.
(Win32) Требует повышенных разрешений или режима разработчика и достаточно новой версии Windows 10. Вы можете проверить, имеет ли текущий процесс необходимые привилегии, используя функцию Win32::IsSymlinkCreationAllowed().
Так как Windows нужно знать, является ли целевой объект каталогом при создании ссылки, Perl-код создаст ссылку как ссылку на каталог только тогда, когда целевой объект существует и является каталогом.
(VMS) Реализовано в 64-битной VMS 8.3. VMS требует, чтобы символическая ссылка была в формате синтаксиса Unix, если она должна разрешаться в действительный путь.
- syscall
-
(Win32, VMS, RISC OS, VOS) Не реализовано.
- sysopen
-
(Mac OS, OS/390) Традиционные
0,1, и2режимы реализованы с разными числовыми значениями на некоторых системах. Флаги, экспортированныеFcntl(O_RDONLY,O_WRONLY,O_RDWR), должны работать на всех системах. - system
-
(Win32) Для оптимизации, может не вызывать оболочку командной строки, указанную в
$ENV{PERL5SHELL}.system(1, @args)запускает внешний процесс и немедленно возвращает его идентификатор процесса, не дожидаясь его завершения. Возвращаемое значение может быть использовано в дальнейшем вwaitилиwaitpid. Неудачное выполнениеspawn()дочернего процесса указывается установкой$?в значение255 << 8.$?устанавливается совместимо с Unix (т.е. статус выхода дочернего процесса получается с помощью$? >> 8, как описано в документации).Обратите внимание, что список форматов system() эмулируется, так как Win32 API CreateProcess() принимает простую строку, а не массив аргументов командной строки. Это может иметь последствия для безопасности вашего кода.
(RISC OS) Нет оболочки для обработки метасимволов, и стандартно передаётся строка команд, завершённая "\n" "\r" или "\0", в запущенную программу. Перенаправление, такое как
> foo, выполняется (если вообще выполняется) библиотекой времени выполнения запущенной программы.system LISTвызовет эмуляциюexecбиблиотеки эмуляции Unix, которая пытается обеспечить эмуляцию stdin, stdout, stderr, действующих в родительском процессе, при условии, что дочерняя программа использует совместимую версию библиотеки эмуляции.system SCALARвызовет непосредственно строку команд, и такая эмуляция дочерней программы Unix не произойдёт. Результаты могут различаться.(Win32)
system LISTбез использования синтаксиса косвенного объекта (system PROGRAM LIST) может перейти к попытке использования оболочки, если перваяspawn()попытка завершится неудачно.(SunOS, Solaris, HP-UX) Не гарантирует автоматического сброса выходных каналов на некоторых платформах.
(VMS) Как и в Win32,
system(1, @args)запускает внешний процесс и немедленно возвращает его идентификатор процесса, не дожидаясь завершения процесса. В этом случае возвращаемое значение может быть использовано в дальнейшем вwaitилиwaitpid. В противном случае возвращаемое значение является подобным POSIX (сдвинутым на 8 битов), что позволяет только для вымышленного значения, полученного из битов уровня серьёзности кода состояния 32-битной нативной системы (если не переопределеноuse vmsish 'status'). Если код состояния нативного процесса содержит закодированное значение POSIX, значение POSIX будет декодировано для извлечения ожидаемого выходного значения. Для получения более подробной информации см. "$?" в perlvms. - telldir
-
(Android) Не реализовано.
- times
-
(Win32) "Накопительные" значения времени будут неверными. На всех платформах, кроме Windows NT или Windows 2000, значение "системное" время будет неверным, а "пользовательское" время фактически является значением, возвращаемым функцией
clock()в библиотеке C.(RISC OS) Неполезно.
- truncate
-
(Более старые версии VMS) Не реализовано.
(VOS) Усечение только до тех же или меньших длин.
(Win32) Если указан FILEHANDLE, он должен быть доступным для записи и открыт в режиме добавления (т.е., используйте
open(my $fh, '>>', 'filename')илиsysopen(my $fh, ..., O_APPEND|O_RDWR). Если указано имя файла, оно не должно быть открытым в другом месте. - umask
-
Возвращает
undefпри недоступности.(AmigaOS)
umaskработает, но правильные разрешения устанавливаются только при окончании работы с файлом. - utime
-
(VMS, RISC OS) Обновляется только время изменения.
(Win32) Возможно, не будет работать как ожидается. Поведение зависит от реализации библиотеки C-времени функции
utime()и используемой файловой системы. Файловая система FAT обычно не поддерживает поле «время доступа», и она может ограничивать временные метки разрешением в две секунды. - wait
- waitpid
-
(Win32) Может быть применён только к дескрипторам процессов, возвращённым для процессов, запущенных с помощью
system(1, ...)или псевдопроцессов, созданных с помощьюfork.(RISC OS) Неполезно.
Поддерживаемые платформы
Известно, что следующие платформы поддерживают компиляцию Perl 5.12 (по состоянию на апрель 2010 года, дату выпуска) из стандартного исходного кода, доступного по адресу http://www.cpan.org/src
- Linux (x86, ARM, IA64)
- HP-UX
- AIX
- Win32
-
- Windows 2000
- Windows XP
- Windows Server 2003
- Windows Vista
- Windows Server 2008
- Windows 7
- Cygwin
-
Известно, что некоторые тесты не проходят:
-
ext/XS-APItest/t/call_checker.t - см. https://github.com/Perl/perl5/issues/10750
-
dist/I18N-Collate/t/I18N-Collate.t
-
ext/Win32CORE/t/win32core.t - может не пройти на последних установках cygwin.
-
- Solaris (x86, SPARC)
- OpenVMS
-
- Alpha (7.2 и более поздние версии)
- I64 (8.2 и более поздние версии)
- NetBSD
- FreeBSD
- Debian GNU/kFreeBSD
- Haiku
- Irix (6.5. Что ещё?)
- OpenBSD
- Dragonfly BSD
- Midnight BSD
- QNX Neutrino RTOS (6.5.0)
- MirOS BSD
- Stratus OpenVOS (17.0 или более поздние версии)
-
Ограничения:
- Проблемы с time_t, которые могут быть или не быть решены
- Stratus VOS / OpenVOS
- AIX
- Android
- FreeMINT
-
Perl теперь компилируется с FreeMiNT/Atari. Несколько тестов не пройдены, что требует дополнительного исследования.
Порт FreeMiNT использует GNU dld для возможностей загрузки модулей. Поэтому убедитесь, что эта библиотека установлена при компиляции Perl.
Платформы, достигшие конца жизненного цикла
(Perl 5.36)
Следующие платформы поддерживались предыдущей версией Perl, но были официально удалены из исходного кода Perl начиная с версии 5.36:
- NetWare
- DOS/DJGPP
- AT&T UWIN
(Perl 5.20)
Следующие платформы поддерживались предыдущей версией Perl, но были официально удалены из исходного кода Perl начиная с версии 5.20:
- AT&T 3b1
(Perl 5.14)
Следующие платформы поддерживались до версии 5.10. Они могли всё ещё работать в версии 5.12, но поддерживающий код был удалён для версии 5.14:
- Windows 95
- Windows 98
- Windows ME
- Windows NT4
(Perl 5.12)
Следующие платформы поддерживались предыдущей версией Perl, но были официально удалены из исходного кода Perl начиная с версии 5.12:
- Atari MiNT
- Apollo Domain/OS
- Apple Mac OS 8/9
- Tenon Machten
Поддерживаемые платформы (Perl 5.8)
По состоянию на июль 2002 года (выпуск Perl 5.8.0), следующие платформы могли скомпилировать Perl из стандартного исходного кода, доступного по адресу http://www.cpan.org/src/
AIX
BeOS
BSD/OS (BSDi)
Cygwin
DG/UX
DOS DJGPP 1)
DYNIX/ptx
EPOC R5
FreeBSD
HI-UXMPP (Hitachi) (5.8.0 worked but we didn't know it)
HP-UX
IRIX
Linux
Mac OS Classic
Mac OS X (Darwin)
MPE/iX
NetBSD
NetWare
NonStop-UX
ReliantUNIX (formerly SINIX)
OpenBSD
OpenVMS (formerly VMS)
Open UNIX (Unixware) (since Perl 5.8.1/5.9.0)
OS/2
OS/400 (using the PASE) (since Perl 5.8.1/5.9.0)
POSIX-BC (formerly BS2000)
QNX
Solaris
SunOS 4
SUPER-UX (NEC)
Tru64 UNIX (formerly DEC OSF/1, Digital UNIX)
UNICOS
UNICOS/mk
UTS
VOS / OpenVOS
Win95/98/ME/2K/XP 2)
WinCE
z/OS (formerly OS/390)
VM/ESA
1) in DOS mode either the DOS or OS/2 ports can be used
2) compilers: Borland, MinGW (GCC), VC6 Следующие платформы работали с предыдущими выпусками (5.6 и 5.7), но нам не удалось либо исправить, либо протестировать их к релизу 5.8.0. Очень велика вероятность, что многие из них будут работать нормально с 5.8.0.
BSD/OS
DomainOS
Hurd
LynxOS
MachTen
PowerMAX
SCO SV
SVR4
Unixware
Windows 3.1 Известно, что следующие платформы не работают с 5.8.0 (но 5.6.1 и 5.7.2 могут работать):
AmigaOS 3 Следующие платформы были известны тем, что компилировали Perl из исходного кода в прошлом (5.005_03 и ранее), но мы не смогли подтвердить их состояние для текущего выпуска, либо потому, что аппаратные/программные платформы редки, либо потому, что у нас нет активного специалиста по этим платформам (или и то, и другое). Хотя они работали раньше, попробуйте скомпилировать их и сообщите о любых проблемах по адресу https://github.com/Perl/perl5/issues.
3b1
A/UX
ConvexOS
CX/UX
DC/OSx
DDE SMES
DOS EMX
Dynix
EP/IX
ESIX
FPS
GENIX
Greenhills
ISC
MachTen 68k
MPC
NEWS-OS
NextSTEP
OpenSTEP
Opus
Plan 9
RISC/os
SCO ODT/OSR
Stellar
SVR2
TI1500
TitanOS
Ultrix
Unisys Dynix Следующие платформы имеют собственные дистрибутивы исходного кода и двоичные файлы, доступные по адресу http://www.cpan.org/ports/
Perl release
OS/400 (ILE) 5.005_02
Tandem Guardian 5.004 Следующие платформы имеют только двоичные файлы, доступные по адресу http://www.cpan.org/ports/index.html :
Perl release
Acorn RISCOS 5.005_02
AOS 5.002
LynxOS 5.004_02 Хотя мы рекомендуем всегда собирать свой Perl из исходного кода, как для максимальной конфигурируемости, так и для безопасности, в случае необходимости вы можете проверить http://www.cpan.org/ports/index.html на наличие двоичных дистрибутивов.
См. также
perlaix, perlamiga, perlbs2000, perlcygwin, perlebcdic, perlfreebsd, perlhurd, perlhpux, perlirix, perlmacosx, perlos2, perlos390, perlos400, perlplan9, perlqnx, perlsolaris, perltru64, perlunicode, perlvms, perlvos, perlwin32 и Win32.
Авторы/сотрудники
Abigail <abigail@abigail.be>, Charles Bailey <bailey@newman.upenn.edu>, Graham Barr <gbarr@pobox.com>, Tom Christiansen <tchrist@perl.com>, Nicholas Clark <nick@ccl4.org>, Thomas Dorner <Thomas.Dorner@start.de>, Andy Dougherty <doughera@lafayette.edu>, Dominic Dunlop <domo@computer.org>, Neale Ferguson <neale@vma.tabnsw.com.au>, David J. Fiander <davidf@mks.com>, Paul Green <Paul.Green@stratus.com>, M.J.T. Guy <mjtg@cam.ac.uk>, Jarkko Hietaniemi <jhi@iki.fi>, Luther Huffman <lutherh@stratcom.com>, Nick Ing-Simmons <nick@ing-simmons.net>, Andreas J. König <a.koenig@mind.de>, Markus Laker <mlaker@contax.co.uk>, Andrew M. Langmead <aml@world.std.com>, Lukas Mai <l.mai@web.de>, Larry Moore <ljmoore@freespace.net>, Paul Moore <Paul.Moore@uk.origin-it.com>, Chris Nandor <pudge@pobox.com>, Matthias Neeracher <neeracher@mac.com>, Philip Newton <pne@cpan.org>, Gary Ng <71564.1743@CompuServe.COM>, Tom Phoenix <rootbeer@teleport.com>, André Pirard <A.Pirard@ulg.ac.be>, Peter Prymmer <pvhp@forte.com>, Hugo van der Sanden <hv@crypt0.demon.co.uk>, Gurusamy Sarathy <gsar@activestate.com>, Paul J. Schinder <schinder@pobox.com>, Michael G Schwern <schwern@pobox.com>, Dan Sugalski <dan@sidhe.org>, Nathan Torkington <gnat@frii.com>, John Malmberg <wb8tyw@qsl.net>
© 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.36.0/perlport