・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';