【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

perlにて現在のディレクトリパスを取得するにはどのようにすればいいのでしょうか?
モジュールをつかってcwd()で取得できるようなのですが、モジュールが入っていないサーバでも動くようにしたいのですがうまくできません・・・
どなたかご存知でしたら教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

if($^O eq "MSWin32"){


$cwd=`cd`;
} else {
$cwd=`pwd`;
}
print $cwd;
--------------
ぐらいでいいんじゃないでしょうか
    • good
    • 0

あ~すみません、serverがwinでしたね


なら#7のは使えません
というか結局普遍的に使えるのはCWDしか無いのでは?
どうしても駄目なら
$0 , __FILE__
環境変数のPWD , SCRIPT_FILENAME , PATH_TRANSLATED(IISの場合)
のうち使えるものを選択して試すとか?
    • good
    • 0

コマンドラインからの実行なら $ENV{'PWD'} にフルパスがそのまま入るかと思います。

(CGIでは駄目)

CGIの場合は
$ENV{'SCRIPT_FILENAME'} =~ m|[^/]+$|; # これで $` にフルパスが入る
print "現在のディレクトリ = $` <P>\n";# 当然コマンドラインでは駄目


$0 や __FILE__ は少なくともfedora5ではコマンドライン、CGIともにパス無しのfile名
/home/tarou/test.cgi なら test.cgiしか入りません
fedora以外でも Apache+suexecではCGIで実行するとパス無しになったはずです
    • good
    • 0

> Perlでは$0という特殊変数に実行したスクリプトのフルパスが保存されています。



フルパスとは限らないみたいですけど?
実際perlvarの$0の項目にも「フルパスで」名前が格納されるとはかかれていません。
    • good
    • 1

確かに外部コマンド(pwdやcd)を使った方が手っ取り早いですが、それではOS依存になってしまいます。


完全にOS依存にしない形にする場合ですが、Perlでは$0という特殊変数に実行したスクリプトのフルパスが保存されています。
これを利用し、chdirするたびにこの変数の値を書き換えることによりディレクトリパスの管理ができそうです。

# スクリプト起動時のディレクトリ取得
$main::cwd = $0;
$main::cwd =~ s|(.*)/.*|$1|; # ディレクトリ部分のみ抜き出し

&my_chdir('foo');

sub my_chdir{
my $path = shift;
chdir($path);# サブディレクトリに移動
$main::cwd = (略) # ディレクトリ移動ごとに書き換え
}
    • good
    • 0

#1>opendir()でディレクトリ内のファイル一覧を行いたく、また階層も行き来できるようにしたい


カレントディレクトリは、別に取得しなくてもいいんじゃないかなあ。
あと
スクリプトの実行ディレクトリということであれば、
__FILE__ から取り出せるかもしれない。
    • good
    • 0

#2さんの回答に関して。


確かにそれでできるかもしれませんが、汚染チェックにひっかかりませんか?
Cwd.pmの中でも同じようなことをしていますが、

# Find the pwd command in the expected locations. We assume these
# are safe. This prevents _backtick_pwd() consulting $ENV{PATH}
# so everything works under taint mode.

と但し書きがあります。
また、コマンドは絶対パスで呼び出しています。

もちろんこれらのリスクをわかった上で、それでもいいというのなら
止めませんが。
    • good
    • 0

> 、モジュールが入っていないサーバでも動くようにしたいのですがうまくできません・・・



どのような手段を試したのでしょうか?

ざっと見たところ、OSのアーキテクチャによって実際に取得を行う
手段を切り替えているようなので、OSによらず動くようにというのは
多分無理です(バイナリで記述する必要があるものがある)。

この回答への補足

opendir()でディレクトリ内のファイル一覧を行いたく、また階層も行き来できるようにしたいと考えております。cgiファイルひとつでなるべく簡単に記述したいと考えていて、そのファイルを書き換えることなく汎用性高いものを考えています。私自身、RedHat系Linuxばかりなので、OSによりバイナリとは初めて聞き勉強になりました(汗
開発環境はWindows(xampp)なので、Win系サーバでも使えたら良いかなと思います。

いろいろ調べたのですが、コマンド実行してその結果を受けるのが一番わかりやすいのではと思っておりますが多くの方はこの場合どういう考え方をされるのでしょうか?

補足日時:2006/08/11 03:43
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Q実行ファイルのパスの取得

現在実行ディレクトリはAです。
また実行ファイルはtest.plでこれらは
/A/B/test.pl
という関係になっています。
test.plでこのようなパスを取得するにはどのようにしたら良いでしょうか?

お分かりの方どうぞ教えてください。

Aベストアンサー

$0

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QPerlで特定行から特定行までを抜き出したい

皆さんのお知恵をお貸し頂ければ幸いです。

Perlで以下のようなことをしたいと考えています。
例えば、次のようなテキストファイルがあったとします。

example.log
==================================
aaaa
hogehoge
test
okok
perl
script
==================================

上記ファイルを読み込んで、「hogehoge」から「perl」の間に挟まれた行だけ抜き出したいのです。
イメージとしては、読み込んだファイルを配列に入れて、一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

このような場合、どういう風にすればいいのでしょうか?
恐れ入りますが、ご教授頂ければ幸いです。

それでは、どうぞよろしくお願い致します。

Aベストアンサー

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $flag = 0 }
  elsif ($flag) { print "$data\n" }
}
close FH;

で、もっと略したいPerlな人だとこんな感じ。Perl独特の記法がふんだんに使われているので、勉強するには不向きかもしれませんが^^;

open FH, "example.log" or die $!;
while (<FH>) {
  print if /^hogehoge$/ .. /^perl$/ and !/^(?:hogehoge|perl)$/;
}
close FH;

※インデントに全角空白を使っているので、コピーする場合はタブなどに置換して下さい。

> 一行づつ読ませ、キーワード「hogehoge」が現れたらそこでフラグを立て、それ以降の行を表示し、キーワード「perl」が現れた時点で表示を止めるという処理になるのかな?と思っています。

それでいいと思いますよ?これをそのままコード化すると、こんな感じでしょうか。(No.1さんのとはちょっと結果が違います。)

open FH, "example.log" or die $!;
$flag = 0;
while ($data = <FH>) {
  chomp $data;
  if  ($data eq "hogehoge") { $flag = 1 }
  elsif ($data eq "perl")    { $fl...続きを読む

QPerlで変数を使用した置換ができない

ファイル内の「1 2 3 4 5」などの数字の箇所を、「1回 2回 3回 4回 5回」のように、「回」をつけた形に変えることを考えています。
以下のようなスクリプトを書きましたが、うまくいきません。

# 「$search_replace」の参照先のテキストファイルの内容
(\d) タブ記号 $1回


EOF

# 問題のスクリプト(一部)
chomp($search_replace);
(my $search, my $replace) = split(/\t/, $search_replace);
$string[$i+1] =~ s/$search/$replace/g; #ここが問題と思われる箇所

ほしい結果は右のとおり。「1回 2回 3回 4回 5回」
現実の結果は右のとおり。「$1回 $1回 $1回 $1回 $1回」

置換文字列の$1の部分がうまく展開(?)できないようです。
どうすればよいか、ご教示ください。

Aベストアンサー

正規表現の置換部はダブルクォート文字列と同様に評価されるので、次の2つの文は同じように機能します。質問のケースでは、変数を2重に置き換えなければならないので、明示的にダブルクォートが必要になります。

$string[$i+1] =~ s/$search/$1回/g;
$string[$i+1] =~ s/$search/"$1回"/eg;

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

Qダブルクォーテーションの削除(置換)

$a = qq/"aaaaaa","bbbbb"/;
print $a;
→ "aaaaa","bbbbb"

としたときの、変数 $a の中にある
ダブルクォーテーションを削除したいのですが、

$a =~ s/"//;
では何も変化が無くて、

$a =~ tr/"/ /;
では半角スペースに置換できるのですが、

$a =~ tr/"//;
では何も変化がありません。

上手く出来る方法はどの様な方法でしょうか?
教えていただければありがたいです。

よろしくお願いいたします。

Aベストアンサー

$a =~ s/"//;
とした時には
→aaaaa","bbbbb"
という風に一つ目の「"」だけは無くなっていませんか?
$a =~ s/"//g;
とすれば全ての「"」を削除できます。

また、tr///を使う時には、
$a =~ tr/"//d;
とすれば変換先リストに無い文字を削除できます・

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm

Q自CGIのURLのパス部分を取得する方法

CGIのURLが http://example.com/test/test.cgi
だったとして、自身のURLのパス部分(http://example.com/test/)を出すには
どのようにしたらいいでしょうか。

CGIモジュールでURLを取得して
最後の/まで切り取る方法もあるかと思いますが
そのURLを取得するのと同じくらい、スマート?に出来ないでしょうか。

アドバイスのほどよろしく御願いします。

Aベストアンサー

Perlを使用しているなら File::Basename モジュールを使用すれば
簡単にパスを取得できます。

use File::Basename;

my $url = 'http://example.com/test/test.cgi';
my $base = (fileparse($url))[1];

print $base;

File::Basename モジュールは標準モジュールなので標準ロケールさえ
インストールしないような特殊な環境でない限り利用できるはずです。

Qひとつの命令を複数行に記述

検索してもあまり解説見かけないなぁと思うのですが、(どこが本家かわからないのでとりあえず放置)

VBでいう_に該当するものは何ですか?
ソースが長くなって見にくくなっているので、対処したいのですが。

hoge = "じゅげむじゅげむごごうのすりきれ" _ '←次の行に送る
& "かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ" 

Aベストアンサー

Perlは、VBと異なり行の概念がありません。
VBではステートメント区切り子が存在しないため、改行がステートメントの区切りとして扱われ、例外的につなげるときに「_」を使うわけですが、
Perlの場合はステートメント区切り子セミコロン「;」がステートメントの区切りになっていますので、セミコロンを打たない限り、何行に分かれてもひとつのステートメントとして扱われます。
したがって、回答としては「そのまま改行してOK」です。
上記の例なら、

$hoge = "じゅげむじゅげむごごうのすりきれ" .
"かいじゃりすいぎょのうんらいまつふうらいまつすいぎょうまつ";

という感じです。
当然ながら、文字列中での改行はダメなので、上記のようにいったん「"」を閉じて、文字列結合演算子「.」で接続することに成ります。

Q上位階層のディレクトリパスを取得する方法

Perlで、あるディレクトリの1つ上のディレクトリパスを
取得する方法を教えていただけないでしょうか。
Perlは初心者ですので、わかりやすくお願いします。

よろしくお願いいたします。

Aベストアンサー

「あるディレクトリ」が絶対パスならばあまり悩むことはなさそうなので、相対パスであることも考慮すると

use Cwd;
$path = Cwd::abs_path("あるディレクトリ" . "/..");

安易な手ですが、こんな感じで取得できると思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング