Ich habe Perl auf Mac, Windows und Ubuntu. Wie kann ich im Skript erkennen, wer welches ist? Danke im Voraus.
Edit: Ich wurde gefragt, was ich mache. Es ist ein Skript, Teil unseres plattformübergreifenden Build-Systems. Das Skript rekursiert Verzeichnisse und ermittelt, welche Dateien erstellt werden sollen. Einige Dateien sind plattformspezifisch. Daher möchte ich unter Linux keine Dateien erstellen, die mit _win.cpp enden.
Untersuchen Sie die Variable $^O
, die den Namen des Betriebssystems enthält:
print "$^O\n";
Welche gibt linux
unter Linux und MSWin32
unter Windows aus.
Sie können diese Variable auch mit dem Namen $OSNAME
referenzieren, wenn Sie das Modul English verwenden:
use English qw' -no_match_vars ';
print "$OSNAME\n";
Gemäß perlport wird $^O
unter Mac OS X darwin
sein.
Sie können auch das Config core-Modul verwenden, das die gleichen Informationen (und vieles mehr) bereitstellt:
use Config;
print "$Config{osname}\n";
print "$Config{archname}\n";
Was auf meinem Ubuntu-Gerät gedruckt wird:
linux
i486-linux-gnu-thread-multi
Beachten Sie, dass diese Informationen auf dem System basieren, das Perl built war. Dies ist nicht notwendigerweise das System, auf dem Perl derzeit ausgeführt wird (dasselbe gilt für $^O
und $OSNAME
); Das Betriebssystem wird sich wahrscheinlich nicht unterscheiden, aber einige Informationen, wie der Name der Architektur, können sehr gut sein.
Wenn Sie genauere Informationen zu Windows benötigen, kann dies hilfreich sein.
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/;
}}
Abgeleitet von sysinfo.t , wobei ich die Originalversion geschrieben habe.
Wenn Sie detailliertere Informationen benötigen:
my ( $osvername, $major, $minor, $id ) = Win32::GetOSVersion();
Sys :: Info :: OS sieht aus wie eine relativ saubere potenzielle Lösung, scheint aber momentan keinen Mac zu unterstützen. Es sollte jedoch nicht zu viel Arbeit sein, um das hinzuzufügen.
Schauen Sie in der Quelle nach File::Spec
, um zu sehen, wie der richtige Delegat basierend auf dem Betriebssystem geladen wird. :)
File::Spec
hat für jedes Betriebssystem eine eigene Perl-Moduldatei. File::Spec::Win32
, File::Spec::OS2
, etc ...
Es prüft das Betriebssystem und lädt die entsprechende .pm
-Datei zur Laufzeit basierend auf dem Betriebssystem.
# From the source code of File::Spec
my %module = (
MSWin32 => 'Win32',
os2 => 'OS2',
VMS => 'VMS',
NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare.
symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian.
dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP.
cygwin => 'Cygwin',
amigaos => 'AmigaOS');
my $module = $module{$^O} || 'Unix';
require "File/Spec/$module.pm";
our @ISA = ("File::Spec::$module");
Die Variable $ ^ O (das ist ein '0', keine Null) enthält den Namen des Betriebssystems.
Je nachdem, was Sie möchten, kann es die Antwort geben, die Sie möchten - auf meinem System gibt es "Linux", ohne zu sagen, welche Distribution. Ich bin mir nicht so sicher, was es unter Windows oder Mac OS sagt.
Hier ist eine kurze Referenz, wie Sie das Betriebssystem finden, auf dem der lokale Computer von Perl aus läuft.
Die Variable $ ^ O ($ OSTYPE, wenn Sie Englisch verwenden) enthält das Betriebssystem, für das Ihre Perl-Binärdatei entwickelt wurde.
Ein klassischer Einliner:
my $windows=($^O=~/Win/)?1:0;# Are we running on windows?
#Assign the $home_directory variable the path of the user's 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;
Für ein generisches Mapping in einem vorinstallierten Perl-Modul checken Sie Perl::OSType
aus.
Es wird von Module::Build
verwendet.