Как я могу обнаружить операционную систему в Perl?

54

У меня есть Perl на Mac, Windows и Ubuntu. Как я могу узнать из script, какой из них? Спасибо заранее.

Изменить: Меня спросили, что я делаю. Это script, часть нашей кросс-платформенной системы сборки. script рекурсирует каталоги и вычисляет, какие файлы нужно создавать. Некоторые файлы зависят от платформы, и поэтому в Linux я не хочу создавать файлы, заканчивающиеся на _win.cpp и т.д.

  • 1
    Зачем тебе знать? [Может быть более подходящий ответ на ваш вопрос, в зависимости от того, что (если что-то) вы делаете, это зависит от платформы.]
Теги:
cross-platform

9 ответов

76
Лучший ответ

Изучите переменную $^O, которая будет содержать имя операционной системы:

print "$^O\n";

Что печатает linux в Linux и MSWin32 в Windows.

Вы также можете обратиться к этой переменной с именем $OSNAME, если вы используете English:

use English qw' -no_match_vars ';
print "$OSNAME\n";

Согласно perlport, $^O будет darwin в Mac OS X.


Вы также можете использовать основной модуль Config, который может предоставить ту же информацию (и многое другое):

use Config;

print "$Config{osname}\n";
print "$Config{archname}\n";

Что на моей машине Ubuntu печатает:

linux
i486-linux-gnu-thread-multi

Обратите внимание, что эта информация основана на системе, которую построил Perl, что не обязательно является системой, в которой в настоящее время работает Perl (то же самое верно для $^O и $OSNAME); OS вряд ли будет отличаться, но некоторые данные, такие как название архитектуры, могут быть очень хорошими.

  • 2
    Спасибо :) А для других людей, которые могут использовать этот ответ, Cygwin Perl возвращает «Cygwin», так что есть две возможности для Windows.
  • 3
    Более, чем два; там был порт dos, и порт os2 раньше мог работать на windows. Все возможные значения $ ^ O теоретически описаны в < perldoc.perl.org/perlport.html >.
Показать ещё 5 комментариев
10

Если вам нужна более конкретная информация о Windows, это может помочь.

my $osname = $^O;


if( $osname eq 'MSWin32' ){{
  eval { require Win32; } or last;
  $osname = Win32::GetOSName();

  # work around for historical reasons
  $osname = 'WinXP' if $osname =~ /^WinXP/;
}}

Выведено из sysinfo.t, которое я написал в оригинальной версии.

Если вам нужна более подробная информация:

my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion();
  • 1
    win32 использует устаревшую функцию GetVersionExA. Это не работает для Версии> 6.2
  • 0
    @ MayraDelgado Действительно, и похоже, что нет прямой замены. Вот почему тот, кто нуждается в этом, должен выяснить, как это исправить и предоставить запрос на удаление. Я все равно редко пользуюсь Windows, так что вряд ли это буду я.
7

Sys::Info::OS выглядит как относительно чистое потенциальное решение, но в настоящее время, похоже, не поддерживает Mac. Это не должно быть слишком много, чтобы добавить это, хотя.

  • 0
    Это был бы лучший ответ, если бы только он поддерживал Mac. Я предпочитаю функции с помощью компилятора строкам с проблемами обслуживания.
  • 0
    search.cpan.org/perldoc?Sys::Info::OS
3

Переменная $^ O (что капитал "O", а не ноль) содержит имя операционной системы.

В зависимости от того, что вы хотите, он может или не может дать ответ, который вы хотите - на моей системе он дает "linux", не говоря, какой дистрибутив. Я не уверен в том, что он говорит в Windows или MacOS.

2

Ниже приведено краткое описание того, как найти ОС, на которой работает локальная машина, от Perl.

Переменная $^ O ($ OSTYPE, если вы используете английский) содержит операционную систему, для которой был создан ваш perl-бинарный файл.

1

Классический однострочный:

my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
  • 6
    За исключением случаев, если вы работаете с Дарвином Осом!
  • 0
    Дерьмо! Ты прав! Делая это чувствительным к регистру, кажется, это исправить. Я исправил это выше. Хороший улов!
1

Просмотрите источник File::Spec, чтобы узнать, как он загружает нужный делегат на основе операционной системы.:)

  • 0
    Это, вероятно, лучший ответ из всех этих. К сожалению, это не считается популярным, потому что никто не хочет проводить какие-либо исследования самостоятельно, кроме переполнения стека. Я собираюсь добавить к ответу, чтобы ленивым людям не приходилось проходить всю тяжелую работу по переходу по ссылке. :П
0
#Assign the $home_directory variable the path of the user home directory
my $home_directory = ($^O eq /Win/) ? $ENV{HOMEPATH} : $ENV{HOME};
#Then you can read/write to files in the home directory
open(FILE, ">$home_directory/my_tmp_file");
print FILE "This is a test\n";
close FILE;
#And/or read the contents of the file
open(FILE, "<$home_directory/my_tmp_file");
while (<FILE>){
    print $_;
}
close FILE;
-2

да использование модуля Config может быть хорошим. Еще одна возможность - получить информацию из файлов /etc/ * release

например.

cat/etc/os-release

NAME="UBUNTU"
VERSION="12.0.2 LTS, Precise Pangolin"
ID="UBUNTU"
ID_LIKE=debian
PRETTY_NAME="Ubuntu precise (12.0.2 LTS)"
VERSION_ID="12.04"
  • 2
    А как насчет окон?
  • 0
    @ M42 использовать Win32; #module для взаимодействия с Win32 API. <br/> Win32 :: GetOSName () - вернет имя ОС <br/> Win32 :: GetOSVersion () <br/> [CORE] Возвращает список (STRING, MAJOR, MINOR, BUILD, ID), где элементы, соответственно: произвольная описательная строка, номер основной версии операционной системы, номер вспомогательной версии, номер сборки и цифра, обозначающая реальную операционную систему. <br/> Вы получите такой o / p <br/> < s21.postimg.org/ymuhihbsn/win32_os_info_perl.jpg > <br> для дополнительной информации о модуле Win32: <br/> < search.cpan.org/~jdb/Win32- 0.47 / Win32.pm >
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню