Perlパスの調査
Perl/CGIプログラム を使って Perlパス を調べてみましょう。
とは言っても、Perlパスを調べるPerl/CGIプログラムを動作させるためには、すでにPerlパスがわかっていないとそのPerl/CGIプログラム自体が動かないという致命的欠点はあるんですが…。
Perlパスを調べるPerl/CGIプログラム
Perl/CGIプログラムを使ってPerlパスを調べるためには、以下のようにコーディングします。
#!/usr/bin/perl
use strict;
my @PATH = &GetPerlPath;
print "Content-type: text/html\n\n";
if (scalar(@PATH)) {
print join ("<br>\n", @PATH);
} else {
print 'Error';
}
exit;
sub GetPerlPath {
if ($^O =~ /MSWin32/i) {
my $perlpath = $^X;
$perlpath =~ s/\\/\//g;
$perlpath =~ s/\.exe$//;
return ($perlpath);
} else {
my $command = 'perl';
my @whereis = ('whereis', '/usr/bin/whereis', '/usr/ucb/whereis');
my @path = ();
foreach (@whereis) {
my $response = `$_ $command`;
next if ($response eq '');
foreach (split(/\s/, $response)) {
if (/\/${command}$/) {
push @path, $_;
}
}
last;
}
unless (scalar @path) {
my $response = `which $command`;
if ($response =~ /$command$/) {
push @path, $response;
}
}
return @path;
}
}
__END__
Perl/CGIプログラムサンプル はこちらに設置してあります。
このPerl/CGIプログラムを実行すると、Perlパスを取得し表示します。
/usr/bin/perl
/usr/local/bin/perl
サーバー上で実行するとこんな感じに表示されます。
UNIX系のレンタルサーバーの場合は、だいたいこのように表示されると思います。
Perl/CGIプログラム説明
Perlパスを取得するPerl/CGIプログラムについて解説します。
メイン処理では、 サブルーチン GetPerlPathでPerlのパスを取り出しています。
GetPerlPath関数で取得したPerlパスは 配列形式 で返されるので、 join関数 を使って1要素1行になるようにして表示させています。
GetPerlPath関数では、Windows系サーバーと、UNIX系サーバーそれぞれに対応できるようになっています。
まずは、 if文 でWindows系サーバーなのかUNIX系サーバーなのかを判定しています。
これは以前「 Perl/CGIプログラムからサーバー情報を取得する 」というところでやりました。
特殊変数「$^O」を参照することによりサーバーOS名を取得できます。
Windowsサーバーの場合は、特殊変数「$^X」からPerlパスを取得し、 置換演算子 で「\」を「/」に変換して末尾の「.exe」を削除し完成です。
UNIX系サーバーの場合は、Perl/CGIプログラムから直接whereisのperlコマンドを使ってPerlパスを取得します。
しかし、インターネットサーバーによってはwhereisだけでは動作しないので、その場合はフルパスで指定します。
これもだいたいパターンが決まっていて、「/usr/bin/whereis」または「/usr/ucb/whereis」です。
コマンド文字列を生成したら「`」ではさむことにより、その結果を取得することができます。
取得した文字列群の中から、「perl」が末尾についているものだけ パターンマッチ で取り出します。
もしここまでの処理でPerlのパスを取得できなかった場合には、`which perl`を指定することによりPerlパスの取得を試みます。