- ベストアンサー
macでperlのopen関数についての質問
- macでperlのopen関数を使ってファイルをオープンする際に、特定の場所にしかファイルを読み込まない問題が発生しています。
- 参考書には、open関数は指定されたファイル名を持つファイルをハードディスクから探し出してオープンすると説明されていますが、実際には探し出しはしてくれないようです。
- ファイルを自分が指定した場所からオープンする方法について、ターミナルで指示するのかコードに加えるべきなのか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 関数openが1カ所のディレクトリしか探さないという動作をすることが問題なのです。 問題ではなく、正しい動作です。 その参考書の書き方(『ハードディスクから探し出し』)が誤解を与えているかもしれません。 「openは『指定したファイルを』開こうと試みる」とした方が正確でしょう。 探したりしません。 指定したものが有るか無いかです。 指定した所に無いからといって、似たものや別の場所にあるものを、勝手に開いたりはしません。 その指定のルールとして ・ファイル名だけなら、カレントディレクトリにある同ファイル名のもの ・相対パスで指定されていたら、カレントディレクトリを起点として相対パスを辿る ・絶対パスで指定されたら、ルートディレクトリ(/)から辿る ということになっています。 ここで、どこにも「ホームディレクトリ」や「実行ファイルのあるディレクトリ」という言葉が出てこない事に注意してください。 > /Users/(myname)/Documents/test/test.pl #(myname)は私の名前のフォルダです。 > にあるコードをターミナル上で実行すると、 > /Users/(myname)/file.txt > に配置しているときしか、読み込んでくれません。 というのは ・スクリプトではファイル名だけしか指定していない→「カレントディレクトリにあるファイル」ルールが適用される。 ・ターミナルを起動したままでcdコマンドでカレントディレクトリを移動しないままに /Users/(myname)/Documents/test/test.pl などと実行している → ターミナル起動時のディレクトリ(/Users/(myname))がカレントディレクトリなので、/Users/(myname)/file.txtを指定したことになる ということだと思います。 例えば、ここで cd Documents としてから /Users/(myname)/Documents/test/test.pl としてみてください。今度は /Users/(myname)/file.txt は読み込まないはずです。cdコマンドでカレントディレクトリを /Users/(myname)/Documents へ移動したことで、 file.txtは /Users/(myname)/Documents/file.txt を指すようになります。 このあたりの概念は、ウィンドウでのGUI操作ばかりやってきた方には理解しずらいところはあるかもしれません。
その他の回答 (2)
- diszo
- ベストアンサー率78% (32/41)
はずしていたらごめんなさい 実行させているディレクトリの位置を確認してみてはいかがでしょうか ターミナルからPerlのスクリプトを実行する場合に、 ホームディレクトリ(/Users/ユーザ名)から コマンド: 「perl Documents/test/test.pl」 等していませんか? ターミナルで実行している場合、 現在いる場所がカレントディレクトリになります。 上記のようなコマンドで実行した場合、 スクリプトのカレントディレクトリが「Users/ユーザ名/」になってしまい、 そのカレントディレクトリの階層にファイルが存在しないと、 ファイルが開けません。 現在のディレクトリ位置を見るには、pwdを使うとわかります。 あとは、cdで移動してください。
お礼
ありがとう御座います。 perlと一緒にUNIXの勉強も始めた所、 おっしゃってることが理解できるようになりました。 プログラムの勉強するには参考書もそうですが、 皆さんに聞いたりするのも大事ですよね! ありがとうございます!
- nora1962
- ベストアンサー率60% (431/717)
「関数openは、指定されたファイル名を持つファイルをハードディスクから探し出し、オープンしようと試みます」 というのは、ハードディスクにあるすべてのファイルから指定されたファイル名をサーチするということではありません(というか、説明が不適切ですね)。 プログラムにはプログラムを実行する時点での「カレントディレクトリ」という概念があり、そこにあるファイルしか基本的には見にいかないのです。 「/Users/(myname)/file.txt」にあるときは、Perlのスクリプトも「/Users/(myname)」で処理を行っていると思います。そこが、カレントディレクトリです。 そこ以外にあるファイルを読み書き使用する場合は明示的に場所を指定するする必要があります。 方法は二つ (1)相対パス 「./subdirectory/file.txt」のように指定します。「.」がカレントディレクトリでそこを基準にしてどこにファイルがあるかを指定するやり方です。 (2)絶対パス 「/home/何ちゃら/file.txt」のように「/」から始まる指定の仕方です。 > ターミナルで指示するのか、それともコードに加えるべきか、 場合によると思います。が、コマンドラインでファイル名を指定できるようにしておいたほうが融通が利く場面が多いかなと。
お礼
カレントディレクトリの概念とUNIXコマンドのcdとpwdを覚えた所、解決しました。 ありがとう御座いました!
補足
ご回答ありがとうございます。 ただ、現状は上記で述べているように 「 /Users/(myname)/Documents/test/test.pl にあるコードをターミナル上で実行すると、 /Users/(myname)/file.txt に配置しているときしか、読み込んでくれません。 」 と、 関数openが 1カ所のディレクトリしか探さないという動作をすることが問題なのです。 ちなみに、test.pl を /Users/(myname)/Documents/test/test.pl 以外に /Users/(myname)/Documents/test/check/test.pl や /Users/(myname)/Documents/check/test.pl や /Users/(myname)/test.pl みたいに配置を変えたとしても、 (カレントディレクトリを変えると表現するのでしょうか?) 関数openは 「 /Users/(myname)/file.txt 」 にfile.txtを配置しているときしか、 file.txtを読み込んでくれないのです。 これは異常でしょうか? また異常でしたら直し方はありますでしょうか? ご回答いただければと思います。
お礼
ありがとう御座います!カレントディレクトリの概念と、UNIXのコマンドなど少し覚えた所、自分の質問している事が明後日の方向を向いている事に気付きました。 また、何かありましたらお願いいたします。