実行ファイル名を取得する

現在実行している Perl/CGIプログラム のファイル名を取得してみましょう。

ウェブブラウザからアクセスされた Perl/CGIプログラム が、自ら自分のファイル名を取得できたら便利ですよね。

なぜなら、Perl/CGIプログラム内で自分のファイル名を定義してしまった場合、もしファイル名を変更しなくてはいけなくなったとき、その部分も一緒に変更しなくてはいけないからです。

たとえ作成途中でファイル名を変更しなかったとしても、Perl/CGIプログラム内で定義した自分のファイル名と、実際に付けられたファイル名が違ってしまう可能性はあります。

このような誤りを避けるためにも、今回紹介する方法などを使ってPerl/CGIプログラム自らが、自分に付けられたファイル名を取得するようにしておくことをおすすめします。

  1. Perl/CGIプログラム作成
  2. Perl/CGIプログラム解説

Perl/CGIプログラム作成

自分に付けられたファイル名を調べるPerl/CGIプログラムを作成してみましょう

#!/usr/bin/perl

use strict;

my $filename = &GetThisFileName;

print "Content-type: text/html\n\n";
if (-e $filename) {
print $filename;
} else {
print 'Error';
}
exit;


sub GetThisFileName {
my $string = "";

if ($0) {
$string = $0;
} elsif ($ENV{'SCRIPT_NAME'}) {
$string = $ENV{'SCRIPT_NAME'};
} elsif ($ENV{'SCRIPT_FILENAME'}) {
$string = $ENV{'SCRIPT_FILENAME'};
} elsif ($ENV{'REQUEST_URI'}) {
$string = $ENV{'REQUEST_URI'};
} else {
return;
}

my ($part) = split(/\?/, $string);
my @parts = split(/\//, $part);
my $name = pop @parts;

return $name;
}

__END__

この Perl/CGIプログラムを実行する と、「index.cgi」など自分に付けられたファイル名を表示します。

Perl/CGIプログラム解説

このPerl/CGIプログラムについて解説します。

メイン処理

メイン処理部分では、 サブルーチン GetThisFileNameから返された値(このPerl/CGIプログラムファイル名)を受け取って表示させています。

このPerl/CGIプログラムファイル名を取得できなかった場合や、存在しないファイル名を誤って指定しないように、 if文 ファイルテスト演算子「-e」 でチェックしてから表示させています。

GetThisFileName関数

GetThisFileName関数は、このPerl/CGIプログラムに付けられたファイル名を調べる サブルーチン です。

Perl/CGIプログラム側から自分に付けられたファイル名を取得するために、このGetThisFileName関数では特殊変数と 環境変数 を参照しています。

特殊変数は「$0」。

環境変数は「$ENV{'SCRIPT_NAME'}」「$ENV{'SCRIPT_FILENAME'}」「$ENV{'REQUEST_URI'}」です。

もしこれらの特殊変数または環境変数から値を取得できなかった場合には、return関数で何も値を返さず終了します。

逆に何らかの値を取得できたら、 変数 「$string」に代入し編集処理に移ります。

なぜ編集処理が必要なのかというと、上記特殊変数または環境変数から取得した値というのは…。

このPerl/CGIファイル名のみが記されている場合と、 ルートディレクトリからこのPerl/CGIファイル名までの絶対パス などが指定されている場合があるからです。

さらに GET送信でパラメータ付き の場合もあります。

なので、このPerl/CGIプログラムファイル名のみに絞る作業が必要だというわけです。

まずは、 split関数 で「?」を基準に分断し、最初の文字列群のみ取得します。

これでもし、 GET送信時にパラメータが付加 されていたとしても除外できます。

次に、 split関数 を使ってパスを「/」ごとに分けてから、末尾の部分のみを pop関数 で抽出します。

これで、このPerl/CGIプログラムファイル名を取得することができました。

あとはreturn関数で、取得したPerl/CGIプログラムファイル名を返して終了です。