• ベストアンサー

Perlファイルテスト演算子が正常に動作しません。

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

>なぜ上の階層で実行しているのでしょうか?? 実行の仕方で異なるのかもしれませんね。 私も#4の方の言われるようにカレントディレクトリが想定しているものと違っているのだと思います。 use Cwd; print getcwd; というようなコードを実行することで 現在のカレントディレクトリを知ることができます。 ワークディレクトリで作業しなければならないということがあらかじめ決まっているなら また、起動する時に -x オプションでパスを指定することで、 指定したパスに移動してから、スクリプトを実行することができます。 また、プログラムが起動してからは、 chdir "パス"; で指定したディレクトリに移動します。 こういうことをしてから実行するのが良いかも知れませんね

love_sen
質問者

お礼

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

その他の回答 (4)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

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

love_sen
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>なぜか一つ上の階層を見ているようです。 それは、ひとつ上の階層で実行しているということだと思いますけど・・ >の$fileにはパス+ファイル名を指定することはできないのですか?? もちろんできますよ。 例えば、 #2>のプログラムで glob("../*.*"); でも実行できます glob("./*.*"); #.は今いるフォルダの意味 で、1つ上の階層のファイルが表示されるなら 今実行されているのがやはり、想定しているより上の階層にいるのだと思います

love_sen
質問者

お礼

ありがとうございます。 $fileにはパスも書くことにしました。 そしたら正常に動くようになりました。 実行ファイルは「ファイル.txt」と同じディレクトリにあるのに、なぜ上の階層で実行しているのでしょうか?? もし分かったら教えてください。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

例えば、同じフォルダ内で以下の様なスクリプトを実行したら結果はどうなりますか? test.pl -------------------------------------- @files=glob("*.*"); for(@files){ printf "%s:%s\n", $_, -e $_; } -------------------------------------- そのフォルダ内のファイルが ファイル.txt:1 の様に表示されるはずですが

love_sen
質問者

お礼

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

love_sen
質問者

補足

ファイル.txt:1 と表示されませんでした。 なぜか一つ上の階層を見ているようです。 なぜ同じ階層のファイルを見てくれないのでしょう? if(-e $file) の$fileにはパス+ファイル名を指定することはできないのですか?? 何度もすみません。。。 お願いいたします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

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

love_sen
質問者

補足

ご回答ありがとうございます。 確認しましたが、 $fileにはif文の前に「ファイル.txt」という値が入っています。 また、このプログラムと同じディレクトリに「ファイル.txt」は存在します。 if(-e "ファイル.txt"){ と書いてもif文の中に入りません。。。 他の部分に問題があるとすれば、どのようなことがありえますか?? 他は正常に動作しているのですが。。。

関連するQ&A

専門家に質問してみよう