blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_2

Perl 「 モジュール 」 CGI.pm 動的な ? my URL を取得する self_url() (0xde)

Perl 「 モジュール 」 CGI.pm 動的な ?  my URL を取得する self_url() (0xde)

目次 - Perl Index


Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xde 回。

CGI.pm で状態情報 ( ? ) を保存しつつ自分自身を参照する URL を作成するメソッド self_url() を確認する。



self_url()



メソッド「 self_url() 」は、その名前の通りじぶんの URL を返します。self_url() は、 次の様に利用します。


my $myself = $q->self_url();


これで、スカラ変数 $myself には、じぶんの URL が代入されます。ちなみに、コマンドライン上でプログラムを実行すると、URL は「 http://localhost 」になります。


例示のミステリー



self_url() は、CGI "状態情報を保持し自分自身を参照する URL の作成" - perldoc.jp で解説されていますが、冒頭に例示される次のコードがうまく動きません。


$myself = self_url;
print q(<a href="$myself">I'm talking to myself.</a>);


このコードで出力される HTML は、次のものだからです。


<a href="$myself">I'm talking to myself.</a>


例示コードの「 q() 」は、シングルクォートを意味するクォート演算子であるので、変数展開がなされていないのだと思われます。

とは思いつつも、もしかすると「 q 」は、HTML の「 q 」タグを意味するのかもしれないと考え、次のコードを試してみましたが、「 Undefined subroutine CGI::q 」というエラーが出て報われませんでした。CGI.pm は、「 q 」などと言うサブルーチンは知らないという訳です。


print $q->q($q->a({-href=>"$myself"},q{I'm talking to myself.}))


(0xbd) で確認した「 新しい HTML タグの生成 」のテクニックを使えば、「 q 」タグを生成してエラーのない出力を得ることが出来ましたが、例示の意図するところとは遠い様に感じます。

「 新しい HTML タグの生成 」のテクニックとは、「 use CGI qw( q ); 」の利用です。得られる出力は次のものです。


<q><a href="http://localhost">I'm talking to myself.</a></q>


んー。


ミステリーは幕を閉じる



例示のコード「 q( ) 」を、次の様に「 qq( ) 」とすれば、おそらく素直だと思われる出力が得られます。


$myself = self_url;
print qq(<a href="$myself">I'm talking to myself.</a>);


上記コードの出力は次の通りです。


<a href="http://localhost">I'm talking to myself.</a>


http://localhost 」の部分は、実際 ( Web からのアクセス時 ) には「 http://your_domain_nama 」になります。まさに、「 self url 」ですね。


self_ulr() の用途



じぶんの URL を得られるという部分では、(0xd3) で確認したメソッド start_html() のパラメータ base の機能と似ていますが、self_url() の解説には次の一節があります。

self_url() は選択されたとき、今動いているすべての状態情報で、 このスクリプトを再度呼び出す URL を返します


パラメータ base の解説とは明らかに異なりますが、ちょっと理解が追い付かないので perldoc CGI の原文の解説を確認します。

self_url() will return a URL, that, when selected, will reinvoke this script with all its state information intact.
( self_url() は返します URL を, , 選択された時, 再度呼び出す このスクリプトを すべての状態情報をそのままで. )


んー。perldoc.jp の次の節を見てみます。

内部のアンカーを使ってドキュメントの中でジャンプしたいけれども、フォームの 現在の内容を壊したくないときにとても有効です。


perldoc CGI の原文は次のものです。

This is most useful when you want to jump around within the document using internal anchors but you don't want to disrupt the current contents of the form(s).
( これはとても便利です あなたがジャンプしたいときに ドキュメント周辺に 使用して 内部アンカーを しかし あなたは壊したくない 現在の内容を フォームの.


んー。

以下のようにするとうまくいきます。


Something like this will do the trick.
( この様にします トリックを)


例示のコードは次のものです。


$myself = self_url;
print "<a href=\"$myself#table1\">See table 1</a>";
print "<a href=\"$myself#table2\">See table 2</a>";
print "<a href=\"$myself#yourself\">See for yourself</a>";


得られる出力は次の通りです ( 読みやすく改行を追加しました )。


<a href="http://localhost#table1">See table 1</a>
<a href="http://localhost#table2">See table 2</a>
<a href="http://localhost#yourself">See for yourself</a>


初めこのコードを見た時は、start_html() のパラメータ base を使えば、self_url() は必要ないのではないかと思いました。

しかしながら、「 今動いているすべての状態情報で 」と、「 フォームの現在の内容を壊したくないとき 」という部分が、僕に大事なことを教えてくれました。

ああ、これ、動的な URL を返すんだなーって。


self_url() が返す動的な URL



メソッド self_url() はつまり、クエリ文字列を含めた URL を取得します。

試しに、次の様なクエリ文字列を指定して実行してみましょう。


my $q = CGI->new('name1=value1&name2=value2');


self_url() からは、次の出力が得られます。


<a href="http://localhost?name1=value1;name2=value2#table1">See table 1</a>
<a href="http://localhost?name1=value1;name2=value2#table2">See table 2</a>
<a href="http://localhost?name1=value1;name2=value2#yourself">See for yourself</a>


なるほど、パラメータ base では出来ない芸当です。


0xde -> 0xdf へ



次回は、メソッド query_string() を確認します。


参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。

参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」


次回 (0xdf) へ続く。

目次 - Perl Index













同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲