スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
Kansai.pm第8回ミーティングに行ってきました@荷造り中
Kansai.pm第8回ミーティングに行ってきました。

僕が、Perlでオブジェクト指向はどう書くのかについてやってほしいとリクエストしたところlapis25さんが「オブジェクト指向言語Perl」と題して発表してくださいました。かなり多くの文献にあたっていただいたようでとても恐縮です。ありがとうございました。

発表のPDFも公開されていますので、行かれてない方は目を通されてはどうでしょうか?

発表後、質問などもさせてもらってPerlのオブジェクト指向について気づいたこと教えていただいたことを書きます。(本当はサンプルコードなどを自分で書きたいのですが、荷造り中ですので さらっと書きます すみません)

Perlにはメンバー変数の概念がない!!

Perlにはメンバー変数の概念がないのでlapis25さんが作ってくれた資料にあるクラス作成例はあれほど短いんですね。コンストラクタの例が短いのも同じ理由です。


だから、結構呼び出し元ががんばります。

(何分やり方は一つではありませんが)呼び出し側は

 ->new( => , => , => , ・・・);


みたいにオブジェクトを作る。


また、メンバー変数の概念がないため、

同じオブジェクトでも知っていることが違う!

つまり、

 ->new( => , => , => , ・・・);


にあたえる引数がそのまま「メンバ変数」と「その値」になると見なせるため、引数が多いと知ってることが多いオブジェクトということになる。

でも、ちょっと疑問が発生。

Perlのオブジェクトにはどうしてよくハッシュのリファレンスが使われるの?

メンバー変数へのPerl5.8的結論

変数なんて値を入れておく箱。変数はけっきょく、「名前(変数名)」と「値」の1対1の関係!


オブジェクト指向→カプセル化したい→変数をまとめたい


       ↓つまり↓


ハッシュでいけるやん!! (1対1の関係だし!まとまってる!)

という発想だと思う。

-------
ここまで読んで、Perlにはメンバー変数の概念がないと言っておいて、メンバー変数とハッシュが関係しているようなこと書いてないか!?と思われた方へ: 具体的なソースをお見せする機会があればそのとき説明できると思います。まあ、概念がないというと言いすぎというか、他の言語みたいには書かないというか(汗) しかし「メソッドのみ継承」のくだりからメンバー変数の概念はないと考えた方がわかりやすいと思う。
-------


そして、Perlのオブジェクト指向には

隠蔽化を強制する仕組みはない

皆、それほどPerlでは隠蔽化に興味はないようだ 変数名が_(アンダーバー)で始まっているものにはアクセスしてくれるなという紳士協定でプログラミングが行われているようである。参考資料:Perlオブジェクト指向プログラミング(Miyagawaさんのメールマガジン)

ほんでもって、
インスタンスメソッドとクラスメソッドの違いも特にない

他の言語ではインスタンスを作ってからでないとそのサブルーチン(メソッド)を呼び出せないインスタンスメソッドとインスタンスを作らなくても呼び出せるクラスメソッドの区別がしっかりしていたりするが、Perlはやはり特に気にしていない。

だから、
package T;

sub print_a{ print "a"; }


T->print_a;

↑のプログラムが実行可能で、 a と表示される。(Tというクラスのメソッドを呼び出したこととなる)


次のソースだと
package T;

sub print_a{ print "a"; }

$hoge = 'T';

$hoge->print_a;

これで、やはり a と表示される。
$hogeには単なる文字列のTが代入されているだけだが
$hoge->print_a; という形で print_a というメソッドを呼び出せる。 なんとPerlは柔軟なんだ!!! こういったPerlの側面が面白いところでもあり、初学者が躓くところでもある。

時間があれば 犬をワンと吠わせるオブジェクトか
Hello World!と叫ぶhumanオブジェクトを作りたい。


------------------------

すべての講演後、時間があまったので、Perlについてのあれやこれやの取りとめのない会話になった。

自分自身を表示するPerlソースを書け という問題をどう解くか?という話題では、

$0 という変数に自分自身のファイル名が入っているのでこの変数をうまく使い 

これで! どうだ! いや これだ! 

などと議論が盛んであった(いや、ここまで熱くはなかったか(笑)。でも2行でできたりなど、すごかった)。


また、

url の ホスト名にあたるところが大文字だった場合小文字にしたいんだけど シンプルで良い正規表現はないだろうか?という話では、
(つまり http:// (この部分!!)/ を処理したい)

s| //(.+?)/ | "//" . lc $1  . "/" |e


注意:わかりやすいようにスペースを入れているので↑のままでは動きません(というか荷造り中ですのでちゃんと試してません)

lc は小文字を返してくれるサブルーチン(?)のようです。またオプションをeにすることによって Perlの式を用いて置換を行えるので

 "//" . 
 といった形で文字列を連結しているようです。


とまあいったところで僕は帰宅しました。


この記事になにかクリティカルな間違いなどがありましたらごめんなさい。


追記:
少なからず関心を示してくださってうれしい限りです。
続きにあたる文章を書いてみました。つたないところもあると思いますがリンクを貼っておきます。http://bingobingobingo.blog49.fc2.com/blog-entry-409.html
個人的には、このように初学者にやさしいテーマもひとつやふたつ勉強会に入れてほしいなと考えます。(リファレンスを扱っている以上、あんまり初学者にやさしくないと思うのだがそのあたりは超えないといけない壁ということでいいのかな・・・)
スポンサーサイト
はしもと
お疲れ様でしたー。
正規表現にxオプションをつけると、正規表現中の空白類は無視してくれるよ。
なので、
s| // (.+?) / | "//" .lc $1 . "/" |ex;
としてもいいのです。
実際には、改行やコメントを正規表現中に入れたい場合に使います。

あと、\l、\u、\L、\Uといったエスケープシーケンスについて調べたら少し幸せになれるかも。

長くなりそうなので、気が向けばボクのはてダに書いてTrackback送ります。
2007/03/11 (日) 00:33:37|URL |#-
ビンゴ中西
お疲れ様でした。

置換をさらっと書けるようになると便利ですよね。 ちょっとはてダの方を拝見させてもらいに行きましたが。すでに\Lを使ったやりかたを載せられてましたね:-)(←トラバがないようなので) また新しい記事で取り上げてくれるのかな? 時間がないようでしたら、無理して書かないでくださいね:-)

2007/03/11 (日) 17:39:26|URL |#-
はしもと
ありゃ?Trackback送ったつもりが…。なんでだろう?
他の記事でxオプションの使い方を軽く書いてみるつもりだけど…いつかは不明(^_^;。
2007/03/11 (日) 21:54:03|URL |#-
ビンゴ中西
あれかな。相手先のurlを記事に貼り付けないとだめだとか。もしくは記事の一部を引用してないとだめだとか、かな・・・

スパム対策のために上のような手続きを踏まないといけなくて昔、僕もはまった気が・・・
2007/03/11 (日) 21:59:22|URL |#-
コメントを投稿する
Name:
URL:
Comment:

秘密:管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事にトラックバックする(FC2ブログユーザー)
ところが、そのないはずの隠蔽化を強制する仕組みがすでに発見されているのです。Perl Best PracticesDamian Conway[邦訳:Perlベストプラクティス]ビンゴ中西のほげほげ Kansai.pm第8回ミーティングに行ってきました@荷造り中そして、Perlのオブジ...
2007/03/11(日) 03:49:33 | 404 Blog Not Found
ブログ検索

プロフィール

ビンゴ中西
Perlが好きである。
プログラミング言語のほとんどは独学。独学の過程で多くのプログラム仲間にも色々教わりました。

FC2カウンター

カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

ブロとも申請フォーム

この人とブロともになる

| ホーム |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。