このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

Mac Perl の非常に基本的な質問

発言者:たろう
( Date Friday, February 08, 2002 15:32:44 )


フォルダの階層を表現する方法がUNIXの『/』とは違って、『:』だということは
解っているのですが、上位の階層を参照する『../』に相当する表現方法が
解らなくて困っています。
当然『..:』は試してみたのですが、エラーになってしまいます。
非常に基本的なことで恐縮なのですが、検索でも見つからないし、
本「一週間でマスターするCGI for Macintosh」にも載っていないので、
どなたかお願いします。
環境:WebSTAR 3J + MacJPerl 5.2.0r4 J1

Junnama さんからのコメント
( Friday, February 08, 2002 15:44:16 )

正式にドキュメントを調べたわけでは無いのですが、
この方法で動いています。

1つ上位なら、『::』、2つ上位なら『:::』

1つ上位の階層のアイテムを出力する
↓
opendir( DIR, "::") or die "Error!";
while($entry =readdir DIR){
  print "$entry\n";
}

たろう さんからのコメント
( Saturday, February 09, 2002 13:05:03 )

ありがとうございました。解決できました。

あと、WebSTAR 3J + MacJPerl 5.2 で変な事を発見しました。

print "Location: ./sita/aaa.html\n\n";
と、書くべきところを
print "Location: :sita:aaa.html\n\n";
にしてしまっていたのですが、問題なく動いていました。

ところが、
print "Location: ../tonari/bbb.html\n\n";
と書くべきところを
print "Location: ::tonari:bbb.html\n\n";
とやるとエラーになってしまいます。

これは、WebSTAR 3Jの中途半端な甘さということでしょうか?

田中求之 さんからのコメント
( Saturday, February 09, 2002 15:54:04 )

>WebSTAR 3Jの中途半端な甘さということでしょうか?

Web サーバは、CGI から送り返されたデータをそのままクライアントに送る
だけですので、CGI の動作にはいっさい関わりませんよ。

MacPerl か、テストに使っていたブラウザか、どちらかが原因です。実際に
ネットに流れたパケットの中身をみてみれば、どちらが原因かははっきりす
ると思いますが。

Junnama さんからのコメント
( Saturday, February 09, 2002 17:03:52 )

MacPerlの場合、確かHTTPのヘッダーを全て自前で書いてやればそのまま送り
出されたように記憶しています。

つまり
"Location: ::tonari:bbb.html\n\n";ではなく

print "HTTP/1.0 302 Found\n";"として
その後にそのまま
Location: ../tonari/bbb.html\n\n";てな具合に書いてみるか、
そもそも
リダイレクトの際にはサーバーのアドレスも含めてきちんとフルパスで書いて
やるのがいいのではないでしょうか。
↑
記憶が曖昧なので違っていたらごめんなさい。

> ネットに流れたパケットの中身をみてみれば、

結局、どのようにやりとりされて、どのようにブラウザが振舞ったのかを見る
のが一番確実ではないでしょうか。

> 中途半端な甘さ

というには調べた情報が今一つ「中途半端」かもしれない...

たろう さんからのコメント
( Sunday, February 10, 2002 07:14:23 )

コメント有り難うございます。

つまり、WebSTAR 3J でやっているサーバでは、見る側のブラウザで
URLのところに
http://www.tarow.com/test/x/y/yyy.html
と書くべきところを、
http://www.tarow.com/test:x:y:yyy.html
と記入しても同じページが開いてしまう。(IE5でも、ネスケ4.7でも。)
UNIXらしきサーバでやっているサイトで真似してみてもエラーになります。

ブラウザがフォルダ階層として認識しない記号「:」が、「/」の代わりに
使えるところに甘さを感じたわけで
そのわりに「::」に対処していないのが中途半端な感じがした訳です。


→  この実験ページ

TOM neko さんからのコメント
( Thursday, February 14, 2002 16:22:07 )

"Location:"に書くURLはフルパスが正式です。
RFC2616より
Location       = "Location" ":" absoluteURI