Spec-Zone.ru › Perl 5.38

perlport

СОДЕРЖАНИЕ

  • ИМЯ
  • ОПИСАНИЕ
  • ПРОБЛЕМЫ
    • Новые строки
    • Порядок байтов чисел и ширина
    • Файлы и файловые системы
    • Взаимодействие с системой
    • Имена команд против путей к файлам
    • Сети
    • Межпроцессное взаимодействие (IPC)
    • Внешние подпрограммы (XS)
    • Стандартные модули
    • Время и дата
    • Наборы символов и кодировка символов
    • Международная поддержка
    • Системные ресурсы
    • Безопасность
    • Стиль
  • Тестировщики CPAN
  • ПЛАТФОРМЫ
    • Unix
    • DOS и производные
    • VMS
    • VOS
    • Платформы EBCDIC
    • Acorn RISC OS
    • Другие Perl
  • РЕАЛИЗАЦИИ ФУНКЦИЙ
    • Алфавитный список функций Perl
  • Поддерживаемые платформы
  • Платформы с устаревшим циклом жизни
    • (Perl 5.37.1)
    • (Perl 5.36)
    • (Perl 5.20)
    • (Perl 5.14)
    • (Perl 5.12)
  • Поддерживаемые платформы (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 делает то же самое для ttys в каноническом режиме. \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 ) удаляются (и было много радости).

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

$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-endian или 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 ограничивает разрешение времени двумя секундами).

Метка времени изменения inode (файлтест -C) на самом деле может быть меткой времени создания (что не так в Unix).

VOS perl может эмулировать имена файлов 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 — это отдельный модуль, обеспечивающий простую, независимую от платформы отправку почты.

Межпроцессное взаимодействие System 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: доступность компилятора 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 — это Mountain Standard Time, было известно, что это может означать Moscow Standard Time). Если вам нужно использовать часовые пояса, выразите их в каком-то однозначном формате, например, в точном числе минут, отступающих от 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, чтобы получить то, что должно быть правильным значением в любой системе.

Наборы символов и кодировка символов

Предполагайте минимально о наборах символов.

Не делайте никаких предположений о числовых значениях (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 pragma и писать свой код в UTF-8, что позволяет вам использовать символы Unicode непосредственно (не только в цитируемых конструкциях, но и в идентификаторах).

Системные ресурсы

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

my @lines = <$very_large_file>;            # bad

while (<$fh>) {$file .= $_}                # sometimes bad
my $file = join('', <$fh>);                # better

Две последние конструкции могут показаться неинтуитивными для большинства людей. В первом случае строка многократно увеличивается, а во втором — большой блок памяти выделяется за один раз. В некоторых системах второй вариант более эффективен, чем первый.

Безопасность

Большинство многопользовательских платформ предоставляют базовые уровни безопасности, обычно реализованные на уровне файловой системы. Некоторые из них, к сожалению, не имеют этого. Таким образом, понятие идентификатора пользователя или «домашней» директории, или даже состояния входа в систему, может быть не распознано во многих платформах. Если вы пишете программы, которые заботятся о безопасности, обычно лучше знать, под какой системой вы будете работать, чтобы вы могли написать код, явно предназначенный для этой платформы (или класса платформ).

Не предполагайте семантики доступа к файловой системе Unix: операционная система или файловая система могут использовать некоторые системы ACL, которые являются более богатыми языками, чем обычные rwx. Даже если rwx существуют, их семантика может отличаться.

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

Не предполагайте семантики пользователей и групп Unix: особенно не ожидайте $< и $> (или $( и $)), чтобы они работали для переключения идентичностей (или членств).

Не предполагайте семантики set-uid и set-gid. (И даже если вы это делаете, подумайте дважды: set-uid и set-gid — известная проблема безопасности.)

Стиль

В тех случаях, когда необходимо иметь код, специфичный для платформы, рассмотрите возможность хранения платформозависимого кода в одном месте, что упрощает перенос на другие платформы. Используйте модуль Config и специальную переменную $^O для различения платформ, как описано в "ПЛАТФОРМЫ".

Будьте осторожны с «синдромом 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 или менее символами, запрещают имена файлов, начинающиеся с - символа, и запрещают имена файлов, содержащие (пробел) или любой символ из набора !#%&'()*;<=>?.

Более новые версии 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

  • Open-Source Software VOS в интернете, 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 Mainframes. Такие компьютеры используют наборы символов EBCDIC внутри (обычно набор символов Character Code Set ID 0037 для OS/400 и либо 1047, либо POSIX-BC для систем S/390).

Остальная часть этого раздела, возможно, нуждается в обновлении, но мы не знаем, что должно быть написано. Пожалуйста, отправляйте комментарии на https://github.com/Perl/perl5/issues.

На мэйнфреймах Perl в настоящее время работает под «Unix system services for 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 для вызова скриптов. Следовательно, скрипты Perl на OS/390 и VM/ESA можно запускать с заголовком, аналогичным следующему простому скрипту:

: # 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-компьютеров (см. "Newlines").

К счастью, большинство веб-серверов для мэйнфреймов правильно преобразуют \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-кодовыми страницами).

См. также:

  • perlos390, perlos400, perlbs2000, perlebcdic.

  • Список perl-mvs@perl.org предназначен для обсуждения вопросов переноса, а также общих вопросов использования для всех Perl-ов EBCDIC. Отправьте сообщение с телом "subscribe perl-mvs" на majordomo@perl.org.

  • Информация о Perl для AS/400 на http://as400.rochester.ibm.com/, а также на CPAN в каталоге ports/.

Acorn RISC OS

Поскольку Acorn используют ASCII с символами новой строки (\n) в текстовых файлах как \012 как в 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. Каждая файловая система поддерживает текущий каталог, и текущий каталог текущей файловой системы является глобальным текущим каталогом. Следовательно, дружественные программы не изменяют текущий каталог, но полагаются на полные имена путей, и программы (и файлы Make) не могут предполагать, что они могут запустить дочерний процесс, который может изменить текущий каталог без влияния на родительский процесс (и всех остальных).

Поскольку дескрипторы файлов родной операционной системы являются глобальными и в настоящее время выделяются от 255 до 0, являющегося зарезервированным значением, библиотека эмуляции Unix эмулирует дескрипторы файлов Unix. Следовательно, вы не можете полагаться на передачу STDIN, STDOUT, или STDERR своим дочерним процессам.

Желание пользователей выразить имена файлов в виде <Foo$Dir>.Bar в командной строке без кавычек также вызывает проблемы: захват вывода команды `` должен выполнить игру в угадайки. Он предполагает, что строка <[^<>]+\$[^<>]> относится к переменной среды, а всё остальное, что включает < или >, является перенаправлением и, как правило, угадывает правильно на 99%. Конечно, проблема остаётся в том, что скрипты не могут полагаться на доступность каких-либо инструментов Unix или на то, что любые найденные инструменты имеют аргументы командной строки, аналогичные Unix.

Расширения и XS, теоретически, могут быть построены любым пользователем с использованием бесплатных инструментов. На практике многие этого не делают, так как пользователи платформы Acorn привыкли к двоичным дистрибутивам. MakeMaker работает, но ни один доступный make не справляется с файлами make MakeMaker; даже если и когда это будет исправлено, отсутствие оболочки Unix вызовет проблемы с правилами makefile, особенно строки вида 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}. См. Config для полного описания доступных переменных.

Алфавитный список функций 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 равно true, если передан спецификатор устройства без явного каталога.

(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 в настройках среды SYSTEM.

(Android) Установка бита исполнения в некоторых местах (обычно /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'. Как и функция CRTL exit(), 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) завершит процесс, указанный %%%CODE_BLOCK_470%%, и рекурсивно все дочерние процессы, принадлежащие ему. Это отличается от семантики Unix, где сигнал будет доставлен всем процессам в той же группе процессов, что и процессу, указанному %%%CODE_BLOCK_471%%.

(VMS) В настоящее время не поддерживается pid -1, указывающий на все процессы в системе.

link

(RISC OS, VOS) Не реализовано.

(AmigaOS) Счётчик ссылок не обновляется, потому что жёсткие ссылки не совсем такие жёсткие (они находятся где-то между жёсткими и мягкими ссылками).

(Win32) Жёсткие ссылки реализованы в Win32 только под NTFS. Они нативно поддерживаются в Windows 2000 и более поздних версиях. В Windows NT они реализованы с использованием поддержки подсистемы POSIX Windows, и 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) Оба режима |- и -| поддерживаются, но список имитируется, так как API Win32 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, вернут эти значения как '', поэтому численное сравнение или манипулирование этими полями может вызвать предупреждения «не число».

(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") и не найдя его, могут попытаться %%%CODE_BLOCK_500%%.

symlink

(RISC OS) Не реализовано.

(Win32) Требует повышенных привилегий или режима разработчика и достаточно новой версии Windows 10. Вы можете проверить, обладает ли текущий процесс необходимыми привилегиями, используя функцию Win32::IsSymlinkCreationAllowed().

Так как Windows должна знать, является ли целевой объект каталогом при создании ссылки, Perl-программа создаст ссылку только как ссылку на каталог, когда целевой объект существует и является каталогом.

Windows не распознаёт слеши как разделители путей в символических ссылках. Следовательно, в Windows любые / в параметре OLDFILE функции symlink() преобразуются в \. Это отражается в результате, возвращаемом readlink(); \ в результате не преобразуются обратно в %%%CODE_BLOCK_504%%.

(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() эмулируется, поскольку API Win32 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() в среде выполнения C и используемой файловой системы. Файловая система 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.37.1)

Следующие платформы поддерживались предыдущей версией Perl, но были официально удалены из исходного кода Perl начиная с версии 5.37.1:

Ultrix

(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
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–2023 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.38.0/perlport

Spec-Zone.ru

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