これ何て呼びますか

ファイルが存在すれば(処理1)、存在しなければ(処理2)を行うような以下のプログラムを書きました。
しかし、ファイルが存在しているにもかかわらず、(処理2)を行ってしまいます。
何か他に注意する点や、ここが問題では?と言うようなことがあれば教えてください。
ちなみにif (-f $file)とも書いてみましたが、同じ結果となりました。

if(-e $file){
(処理1)
}else{
(処理2)
}

A 回答 (5件)

>なぜ上の階層で実行しているのでしょうか??


実行の仕方で異なるのかもしれませんね。
私も#4の方の言われるようにカレントディレクトリが想定しているものと違っているのだと思います。

use Cwd;
print getcwd;

というようなコードを実行することで
現在のカレントディレクトリを知ることができます。

ワークディレクトリで作業しなければならないということがあらかじめ決まっているなら
また、起動する時に
-x オプションでパスを指定することで、
指定したパスに移動してから、スクリプトを実行することができます。

また、プログラムが起動してからは、
chdir "パス";
で指定したディレクトリに移動します。
こういうことをしてから実行するのが良いかも知れませんね
    • good
    • 0
この回答へのお礼

アドバイスの通りにしてみようと思います。
どうもありがとうございました。

お礼日時:2004/12/27 10:30

>実行ファイルは「ファイル.txt」と同じディレクトリにあるのに、なぜ上の階層で実行しているのでしょうか??


>もし分かったら教えてください。
perlを実行するときに、カレントディレクトリ(unixの場合はワーキングディレクトリ)という概念があります。これは、今、どのディレクトリに自分がいるかということを示します。実行ファイル=スクリプトファイル(もしくはperl.exe本体)のことを言っているのかと思いますが、perlの実行時、ワーキングディレクトリは、必ずしも、実行ファイルの存在するところと一致しません。(とうよりは、通常一致しません)それは、perl本体を起動する親プロセスのワーキングディレクトリが今、どこにあるかによって決まります。通常、子プロセス(=perl.exeが実行されているプロセス)は、親プロセスのワーキングディレクトリを引き継ぎますので。(但し、明示的にどのワーキングディレクトリでperlを実行するかを指定することも出来ます)
親プロセスは、webサーバなどの場合は、アパッチかと思いますので、そちらの設定で、ワーキングディレクトリが決まるかと思います。
perlが今、どのディレクトリで動いているかを確認するには、
system("pwd"); ・・・UNIX
system("cd"); ・・・windows
として下さい。これで、自分のいるディレクトリがわかります。
    • good
    • 0
この回答へのお礼

カレントディレクトリを調べたら、やはり一つ上の階層で実行していました。
とても勉強になりました。
ありがとうございます。

お礼日時:2004/12/27 10:27

>なぜか一つ上の階層を見ているようです。


それは、ひとつ上の階層で実行しているということだと思いますけど・・

>の$fileにはパス+ファイル名を指定することはできないのですか??
もちろんできますよ。

例えば、
#2>のプログラムで
glob("../*.*");
でも実行できます

glob("./*.*");
#.は今いるフォルダの意味
で、1つ上の階層のファイルが表示されるなら
今実行されているのがやはり、想定しているより上の階層にいるのだと思います
    • good
    • 0
この回答へのお礼

ありがとうございます。
$fileにはパスも書くことにしました。
そしたら正常に動くようになりました。

実行ファイルは「ファイル.txt」と同じディレクトリにあるのに、なぜ上の階層で実行しているのでしょうか??
もし分かったら教えてください。

お礼日時:2004/12/24 17:25

例えば、同じフォルダ内で以下の様なスクリプトを実行したら結果はどうなりますか?


test.pl
--------------------------------------
@files=glob("*.*");
for(@files){
printf "%s:%s\n", $_, -e $_;
}
--------------------------------------
そのフォルダ内のファイルが
ファイル.txt:1
の様に表示されるはずですが

この回答への補足

ファイル.txt:1
と表示されませんでした。
なぜか一つ上の階層を見ているようです。
なぜ同じ階層のファイルを見てくれないのでしょう?

if(-e $file)
の$fileにはパス+ファイル名を指定することはできないのですか??

何度もすみません。。。
お願いいたします。

補足日時:2004/12/24 16:40
    • good
    • 0
この回答へのお礼

補足なんですが、このプログラムを呼び出しているプログラムも、一つ上の階層を見ていました。
物理的にはすべて「ファイル.txt」と同じディレクトリにあります。
実行するディレクトリが変更されることってあるのですか?

お礼日時:2004/12/24 17:03

プログラム自体は、問題ありません。


他の部分に問題があるのだと思います。
これだけの、プログラムだと
$file にちゃんとファイル名が設定されているか
本当にその時実行されているディレクトリにそのファイル名があるかないか
ぐらいしか問題点ってないと思います。

この回答への補足

ご回答ありがとうございます。

確認しましたが、
$fileにはif文の前に「ファイル.txt」という値が入っています。
また、このプログラムと同じディレクトリに「ファイル.txt」は存在します。
if(-e "ファイル.txt"){
と書いてもif文の中に入りません。。。

他の部分に問題があるとすれば、どのようなことがありえますか??
他は正常に動作しているのですが。。。

補足日時:2004/12/24 15:15
    • good
    • 0

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