ライブラリの使い方って?

[上に] [前に] [次に]
アルプスの少女アーデルハイド 1999/12/06(月) 16:29:21
http://www.tohoho-web.com/wwwperl1.htm#Library
を読んだのですが、作り方がよく分からないので教えてください。

各CGIから呼ばれるライブラリを作ろうとしています。
ライブラリの中では「ファイルがあれば、リンク表示を行う」という動きをさせようと思っています。
ところが、下のような作り方をしたらエラーになってしまいました。
-------------------------
ライブラリ
package link;
sub display {
 if (-e $_[0]/profile.html) { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
}
#
1;
---------------------------
ライブラリを呼ぶところ
 :
require 'link.pl';
&link'display($dir);
                $dir … ディレクトリ名

andi 1999/12/06(月) 17:48:12
if文の中が文字列になってるからじゃないですか?
どうでしょう。

アルプスの少女アーデルハイド 1999/12/06(月) 17:59:01
すいません、「if文の中が文字列になってるからじゃないですか?」とはどういう意味でしょうか?

「$dir … ディレクトリ名」というのは、例えば「/usr/local/…」というディレクトリ名が入っているという意味。
「print DB」とは、ライブラリを読んでる側での、配列名です。

wosamu 1999/12/06(月) 18:11:26
どのような環境でどのような行動をしてどのようなエラーが出たかを書くと、
解決までの時間が劇的に短くなる傾向にあるように思われます。

>if (-e $_[0]/profile.html) { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
このDBというファイルハンドルはどこで定義されているのでしょうか。
省略されているところなのかな?
>if文の中が文字列になってるからじゃないですか?
多分それですね。
>if (-e $_[0]/profile.html) { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
の部分の$_[0]/profile.htmlをダブルクォートとかで囲むと動きそうです。

アルプスの少女アーデルハイド 1999/12/06(月) 18:33:18
>このDBというファイルハンドルはどこで定義されているのでしょうか。

ライブラリを呼んでる側で

if (!open(DB,">$file_html")) { &error('161',"$file_html へ書き込みできません. パーミッションを確認してください."); }
print DB "<HTML>\n";
print DB "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
print DB "<META content=\"text/html; charset=x-sjis\" http-equiv=Content-Type>\n"
  :
  :
&link'display($dir_html_url/$username);

のようにして、htmlファイルを書き出しています
perl -c xxxxx のチェックでは、呼び出し側もlink.pl側もSyntax OKでしたが、いざ実行させると、&link'displayの前で、処理が止まり(ドキュメントにデータが含まれていません…ネスケの場合のメッセージ)htmlファイルもそこの処理までしか出力されません。



>$_[0]/profile.htmlをダブルクォートとかで囲むと動きそうです。

試しにやってみましたが、動きませんでした(激涙)。
# ダブルクォートって、「"」のことですよね?

P初心者 1999/12/06(月) 18:45:26
以下を変えてみたら?
&link'display($dir_html_url/$username);

&link'display("$dir_html_url/$username");


アルプスの少女アーデルハイド 1999/12/07(火) 09:03:48
>以下を変えてみたら?
>&link'display($dir_html_url/$username);
>は
>&link'display("$dir_html_url/$username");
>へ

 やってみました。
 エラーにはなりませんでしたが、肝心のlink.pl内で$_[0]/profile.htmlが存在するにも関わらず、DBに"[<a href=\"$_[0]/profile.html\">プロフィール</a>]"を出力してくれません。

 どうして〜〜?(激泣)

P初心者 1999/12/07(火) 09:37:57
以下を変えてみたら?
if (-e $_[0]/profile.html) { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }

if (-e "$_[0]/profile.html") { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }


アルプスの少女アーデルハイド 1999/12/07(火) 09:44:53
>以下を変えてみたら?
>if (-e $_[0]/profile.html) { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
>を
>if (-e "$_[0]/profile.html") { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
>へ

 それは、既にやっています・・・(激滝涙)。

wosamu 1999/12/07(火) 10:08:54
私、ちょっと確認できないのですけど
perlのファイルハンドルってグローバル変数なんですか?
リンク部分以外のヘッダを出力しているのに、モジュール部の出力だけ無いのなら
関数にファイルハンドルを引数として渡してみたらいかがですか?
やり方はわかんないのですけど。
#型グロブを使うので良いのですかな。
#私はそうしているのですけど。

バーチャルヒューマン [E-Mail] [HomePage] 1999/12/07(火) 11:57:20
そうですね。wosamu さんの言う通りでした。
ちなみに、
>if (-e "$_[0]/profile.html")
こうするのもお忘れなく! さもなくば、0除算で失敗というエラーに
なりました。
#0除算は、実行エラーなので、SyntaxはOKになります。

こんな感のソース(あくまでもTEST用)をtemp.plとして実行した結果
−−−
#require 'link.pl';

if ( !open(DB,">file_html") ) {}# &error('161',"$file_html へ書き込みできません. パーミッションを確認してください."); }

print DB "<HTML>\n";
print DB "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
print DB "<META content=\"text/html; charset=x-sjis\" http-equiv=Content-Type>\n";

&link'display("./");

package link;
sub display {
if (-e "$_[0]/profile.html") { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
}
#
1;
−−−

$ perl -wc temp.pl
Name "link::DB" used only once: possible typo at temp.pl line 13.
temp.pl syntax OK

となるので。package link 宣言以下では、ファイルハンドルも
デフォルトでは、そのモジュールクラスに属するようです。

簡単に修正するには、
>if (-e "$_[0]/profile.html") { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }

if (-e "$_[0]/profile.html") { print main::DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }

#TESTしたperlバージョンは5.005_03です。

アルプスの少女アーデルハイド 1999/12/07(火) 12:31:32
[[解決]]
>簡単に修正するには、
>if (-e "$_[0]/profile.html") { print DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
>↓
>if (-e "$_[0]/profile.html") { print main::DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }

 わぁ〜〜、うまくいったぁ〜〜。
 ありがとう、バーチャルヒューマンさぁん!

 うれしいー!!
 今度、アルムに来た時に、おおつののダンナに会わせてあげるね!

wosamu 1999/12/07(火) 12:46:01
>if (-e "$_[0]/profile.html") { print main::DB "[<a href=\"$_[0]/profile.html\">プロフィール</a>]"; }
こうすれば確かにソースの修正は最小限で済みますね。さすがです。
ですが個人的にはこれでしたら呼び出し側(というか、mainオブジェクト?)に
必ずDBというファイルハンドルがオープンされている必要があるので
私は引数で渡すやり方のほうが好みです。

バーチャルヒューマン 1999/12/07(火) 13:11:59
解決済ですが、、、

@wosamu wrote:
>ですが個人的にはこれでしたら呼び出し側(というか、mainオブジェクト?)に
>必ずDBというファイルハンドルがオープンされている必要があるので
>私は引数で渡すやり方のほうが好みです。

私もそう思います。今回の問題は、ライブラリ内で起こっている不具合
なので、ライブラリの目的に合致する方法で最終的には対処すべきでしょう。
先の簡単な解決方法はあくまでも何が原因なのかを示す指標と思ってください。

[上に] [前に] [次に]