02 April 2011

(Perl) webとコマンドライン双方で通用するユーザのホームディレクトリを得る方法

・Python , PHP の場合は → 『(Python, PHP) webとコマンドライン双方で通用するユーザのホームディレクトリを得る方法

Perlでユーザのホームディレクトリ (例:/home/user )を得る方法は

シェル内でスクリプトとして実行される場合は、次のように環境変数から求めてもよい。

$ENV{'HOME'}

だが、これはWeb上から呼ばれるcgiプログラムの場合は通用しない。コマンドライン、Web上双方で通用する方法は

(getpwuid($<))[7]

となる。でもって、ホームディレクトリを取得するサブルーチンを次のように書いてみる

 
sub sub_get_homedir {
	# コマンドライン時のみ
	if (exists($ENV{'HOME'}) and defined($ENV{'HOME'}) and length($ENV{'HOME'})>1) {
		return($ENV{'HOME'});
	}
 
	# コマンドライン & Web
	my $str = ((getpwuid($<))[7]);
	if(defined($str) and length($str)>1){
		return((getpwuid($<))[7]);
	}
 
	# Webのみ
	if(exists($ENV{'DOCUMENT_ROOT'}) and defined($ENV{'DOCUMENT_ROOT'}) and length($ENV{'DOCUMENT_ROOT'})>1) {
DOCUMENT_ROOT)";
		return(dirname($ENV{'DOCUMENT_ROOT'}));
	}
 
	return '';
}

プログラム中でこのサブルーチンを呼ぶ場合は特に問題ないが、Perlのコンパイル時に評価される use lib のような構文中で使うと…

#!/usr/bin/perl
 
use strict;
use warnings;
 
use lib sub_get_homedir().'/local/lib/perl5';

これはエラーとなる。コンパイル時にサブルーチンがまだ評価されていないので、「Use of uninitialized value in concatenation (.) or string」というエラーを吐く。

ユーザが指定したライブラリを読み込むパスに使う場合は、素直に次のようにする

#!/usr/bin/perl
 
use strict;
use warnings;
 
use lib ((getpwuid($<))[7]).'/local/lib/perl5';