Perlパスの調査

Perl/CGIプログラム を使って Perlパス を調べてみましょう。

とは言っても、Perlパスを調べるPerl/CGIプログラムを動作させるためには、すでにPerlパスがわかっていないとそのPerl/CGIプログラム自体が動かないという致命的欠点はあるんですが…。

  1. Perlパスを調べるPerl/CGIプログラム
  2. 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パスの取得を試みます。