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. В Perl-системах, подобных DOS, \n обычно означает \012, но при обращении к файлу в режиме "текст" perl использует слой :crlf, который преобразует его в (или из) \015\012, в зависимости от того, читаете вы или пишете. Unix делает то же самое для tty в каноническом режиме. \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 так не является).
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, DJGPP, 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 — это отдельный модуль, который предоставляет простую и независимую от платформы отправку почты.
Unix 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 locale в perllocale. Система locale, по крайней мере, пытается сделать вещи немного более портативными, или по крайней мере более удобными и дружественными для пользователей, не использующих английский язык. Система влияет на наборы символов и кодировки, а также на форматирование дат и времени – среди прочего.
Если вы действительно хотите быть международными, вы должны рассмотреть 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-подобных перлов таковы:
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.
Старое поведение в настоящее время сохраняется со всеми его недостатками для обратной совместимости, но пользователям рекомендуется изменить любой код, который проверяет $! на WSAE* константы для ошибок Winsock, чтобы вместо этого проверять $^E на WSAE* константы. После подходящего срока устаревания, который начался с Perl 5.24, старое поведение может быть удалено, оставляя $! неизменным после вызовов функций Winsock, чтобы избежать возможной путаницы, какой переменной ошибки проверять.
См. также:
-
Среду djgpp для DOS, http://www.delorie.com/djgpp/ и perldos.
-
Среду 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/
-
Среду U/WIN для Win32, http://www.research.att.com/sw/tools/uwin/
-
Инструкции по сборке для 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
-
VOS Open-Source Software в сети http://ftp.stratus.com/pub/vos/vos.html
EBCDIC Платформы
v5.22 ядро Perl работает на z/OS (ранее OS/390). Теоретически, оно могло бы работать и на наследниках OS/400 на миникомпьютерах AS/400, а также на VM/ESA и BS2000 для мэйнфреймов S/390. Такие компьютеры используют внутренне кодировку EBCDIC (обычно Character Code Set 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.
-
Информация об AS/400 Perl по адресу 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. Каждая файловая система поддерживает текущий каталог, и текущий каталог текущей файловой системы - это глобальный текущий каталог. Следовательно, дружественные программы не изменяют текущий каталог, но полагаются на полные имена путей, и программы (и Makefiles) не могут предполагать, что они могут запустить дочерний процесс, который может изменить текущий каталог, не повлияв на родительский (и всех остальных).
Поскольку дескрипторы файлов родной операционной системы глобальны и в настоящее время выделены от 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).
-
Бесплатный perl5-based PERL.NLM для Novell Netware доступен в виде предварительно скомпилированных бинарных файлов и исходного кода по адресу http://www.novell.com/, а также с CPAN.
-
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равно 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'. Как и функцияexit()CRTL,exit 0также сопоставляется со статусом выходаSS$_NORMAL(1); это отображение нельзя переопределить. Любой другой аргумент кexitиспользуется непосредственно в качестве статуса выхода Perl. В VMS, если не включен режим POSIX_EXIT, код выхода всегда должен быть допустимым кодом выхода VMS, а не общим числом. При включении режима POSIX_EXIT общее число будет закодировано способом, совместимым с макросом _POSIX_EXIT библиотеки C, чтобы его могли декодировать другие программы, особенно написанные на 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) Оба режима
|-и-|поддерживаются, но список реализован эмулированно, так как 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— это время создания, а не время изменения inode.(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. Ошибка при запуске подпроцесса указывается установкой$?в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, оно будет декодировано для получения ожидаемого значения выхода. Для более подробной информации обратитесь к "$?" в 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) Может работать не так, как ожидается. Поведение зависит от реализации функции
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.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, perldos, perlebcdic, perlfreebsd, perlhurd, perlhpux, perlirix, perlmacos, perlmacosx, perlnetware, 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.34.0/perlport