現代的な Perl を再習得する方法は? 90
ストーリー by reo
モダン Perl 入門 部門より
モダン Perl 入門 部門より
ある Anonymous Coward 曰く、
久しぶりに Perl で本格的な Web アプリを書こうと思い始めたが、その間に Perl の世界は大きく変わってしまったようで、include jcode.pl が当然だった時代からすると、現代的に書かれたソースはまるで別言語のようだ。
モジュール等を活用した現代的な Perl を再習得したいが、書籍を買おうにも現代的な手法を知らない人間にとっては、どの本が現代的なのかの区別が出版日ぐらいでしかつけられない。
現代的な Perl を習得するためには、どのようなステップを踏むのが良いだろうか ? またお勧めの書籍などあったら教えて欲しい。
Japan Perl Association (スコア:5, 参考になる)
Japan Perl Association [perlassociation.org] (JPA) 代表の牧です。
JPAはまさにそういった方を支援していきたいと考えています。企業等でそういったニーズがある場合はJPAで研修等を行っています [perlassociation.org]。カリキュラムはまだまだ調整中ではありますが、希望さえあればそのあたりは細かい調整は可能ですので興味がある方は是非ご一報ください。
また手前味噌で恐縮ですが、今年の初めに「モダンPerl入門 [amazon.co.jp]」という本を書かせていただいております。モダンPerlを網羅しているとは言いませんが、私がここ1,2年で使ってきた技術等に関してはおおよそカバーしていますので、そちらも参考にしていただければ幸いです。
他にも要望等ありましたら是非ご意見をお聞かせください!
Re:Japan Perl Association (スコア:2)
すみません、そのご著書は Amazon のほしい物リストに入れっぱなしで忘れてました(w
夏休みには買うと思います!
# 夏休みがあればですが orz
Webアプリを書くんなら (スコア:4, 興味深い)
さいきん、友人から「CGI 勉強したいんだけどどうすればいい?」と聞かれて
どんなスキル・知識が必要か考えてみました。
(1) HTML(XHTML) のコーディングスキル
(2) JavaScript でのプログラミングスキル
(3) Perl や PHP などでのプログラミングスキル
(4) HTTP プロトコルについての理解
(5) Apache や IIS の動作理解および設定
(6) 文字コードに関する諸問題の知識
(7) データベースについての知識
私は C言語から今のキャリアをスタートしたんですが、
こうやって挙げてみると覚えることいっぱいあるな…
Perl の知識だけ更新しても足らないかも。
Re:Webアプリを書くんなら (スコア:1)
各々の項目に含まれているという認識であったなら申し訳ないが、
セキュリティについての知識も是非。
1を聞いて0を知れ!
自分の場合ですが (スコア:3, 参考になる)
Perlプログラミング救命病棟 [amazon.co.jp]→Perl Hacks [amazon.co.jp]→モダンPerl入門 [amazon.co.jp]の順に読みましたが、従来の"require 'jcode.pl';"なスタイルからは完全に脱却し、自分なりのモジュールを作成出来るところまで至ることができました。
特に「Perlプログラミング救命病棟」は、「モダンPerl入門」への架け橋としてオススメできます。
@ytnobody
Per… (オフトピック) (スコア:3, おもしろおかしい)
この件について検索しようとして、無意識に
「Perfume あ~ちゃん」とか打っててがく然とした orz
# ウェブ履歴はそればっか
Re:Per… (オフトピック) (スコア:1)
首までつかっちゃってるんで、もう恥ずかしいとも思わないんですね。
日記にも書いちゃってるし。
# カルマボーナスは忘れてました orz
女房にはキモチ悪いと言われ、JK の娘には親父キモいと蔑まれても
CD、DVD に動画、雑誌、写真集とメディアを渉猟する日々。
ちなみに、今まで全集的に集めたのは YMO、PINK、Michel Petrucciani、
ベートーベンのピアノソナタにブラームスのピアノ作品などです。
# 生きることは恥をかくことなり
Re:Per… (オフトピック) (スコア:2, すばらしい洞察)
ドウシテオレハ、ココニイルンダ!
現代的なPerl ? (スコア:2, すばらしい洞察)
Re:現代的なPerl ? (スコア:4, 興味深い)
2000年前半までは「Effective Perl」を読んでおけばperl初心者からは脱出、という時代でしたね。
現代では、そのレベルより先に進むなら、RubyかPythonを学んだ後にperlで同様なことを実現する手法を探したほうがよさげです。
まぁすると、perlをやりたいのか、「モジュール等を活用した現代的プログラミング」をやりたいのかどっちなんだ、という話になってきますが…。
Re:現代的なPerl ? (スコア:2, 参考になる)
> プログラミング言語 Ruby
オフトピになっちゃっていますが、Perlはmyなんて書いてられないし、
生まれたときからのオブジェクト指向言語じゃないから書く量が多く
なっちゃうし、ソースの見た目が変だし… 特にこれを使いたい/使
わなければならないっていうPerlモジュールがなければRubyかPython
かもっと新しい言語のほうが幸せになれるのでは。
PerlのCPANはたしかにすごいけど、
Rubyのgemはもっと宣伝されてよいと思う。
Pythonは何だっけ???
さあ宗教戦争だ!
love && peace && free_software
t-nissie
Re:現代的なPerl ? (スコア:1)
> Pythonは何だっけ???
PyPI [python.org]
#「ぱいぱい」... この語感がたまらない。
と、easy_install かな。
Re:現代的なPerl ? (スコア:1)
Perlに限ったことじゃないんですが、「外部ライブラリが自在に使えるようになる」習得レベルまでジャッキアップしてやると、あとは特に教育を施さなくても本人が自分で勝手に学ぶようになります。
言語教育って、そこまでのレベルに到達するまでの道のりをどう埋めてやるかなんですよ。
Perlって他言語と比べると結構その距離が大きいんですよね。
コンテキストとかリファレンスとかスライスとか。
このギャップを埋めてくれる本というと…やっぱ「Effective Perl」かなぁ。
perlって、perl4までの範囲で使っていれば軽量お手軽言語として十分なんですけどね。。
Re:現代的なPerl ? (スコア:1)
> Pythonは何だっけ???
Python Package Index [python.org]ってのがありますね。
Re:現代的なPerl ? (スコア:1)
myばっか書きたくないって理由でpythonに流れてきたら、selfばっか書きたくないと嘆くようになるのは目に見えてます。
1を聞いて0を知れ!
Re:現代的なPerl ? (スコア:1)
Javaでわざわざthis書くよ。
…ってまぁ、IDEの補完機能をあてにしてるんだけど。
Re:現代的なPerl ? (スコア:1)
単なる変数名に過ぎないので、何に置き換えてもいいというのは知っていますが、どっちにせよ繰り返し書かなければいけないんですよね。
# もう、いっそのことmyにした方がタイプ数減るよな。
1を聞いて0を知れ!
Re: (スコア:0)
気持ちは良くわかります (スコア:2)
知人に勧められ、自分も3年前から再学習し始めました。それまではCGIでちょこっと(もちろんjcode.plも)やってたくらいなので、元記事の人の気持ちは良くわかります。
ただ、引数の参照やら何やらで、いまだに書いて実行の繰り返しになっているのが、いただけないです(新旧関係なく、本人の学習能力の問題かもしれない)。いまいち馴染めない構成があります。
ひとついえるのは、CPANがとってもすばらしい。あんなのが味方につけられるなんて、それだけでも学習する価値あり、だと思います。ただ、実現するのに「数通りの文法がある」というのは、少々気持ちが悪い。
#or die;とか見たときの衝撃は忘れられない。
rubyもいいんですが、「デフォルトで入っている」という面で一歩出遅れでしょうか?自分はDebianで、Perlはデフォルトではない(と思った)のですが、よく使うパッケージの依存関係で勝手に入ります。FreeBSDもそうだったような。本来であればPythonのほうがいいのかもしれません。パッケージのインストール権限が無いマシンで、サクッと書けて動かせるのは、重要な利点だと思います。
-- gonta --
"May Macintosh be with you"
Re:気持ちは良くわかります (スコア:1, 参考になる)
やり直すと考えずに、1からはじめると考えればいいのでは (スコア:2, 参考になる)
現代的な Perl を習得するためには、どのようなステップを踏むのが良いだろうか ?
とりあえず、ラクダ本2分冊を読む事から始めるべきではないかと。
「現代的な」とかそういうのは、その後で十分だと思うし、どうも話を見ている限りでは「忘れてしまって判らなくなっている穴の方が大きい」ようだぞ。
# 数年前に同じような事をやったので、間違いない。
fjの教祖様
Re:やり直すと考えずに、1からはじめると考えればいいのでは (スコア:1)
いや、それでも、ラクダ本だ。他にチョイスはない。
「1からはじめると考えろ」とは言ったが、文字通り1からはじめる場合との違いはあるわけで。最大の違いは、「今までに使ってきた教科書の有無」。大昔にはラクダ本しかなかったのだから、まずラクダ本の最新版を見るべきだ。それによって どれぐらい変わってしまったか、身をもって知ることができる。
これを先にやらないと、他の本も斜め読みで済ませてしまい、後で
「あれ?」
という事になる。
.
私が思うに、昔の Perl と今の Perl の違いの内、最も尾を引く厄介な存在は リファレンス。オブジェクト指向だの何だのは全部このリファレンスの上に強引に載せている。しかも、Perl は「名前空間」が $ と @ と % で独立しているので、自分の意図と違う事を書いてしまってもなかなか問題が発見できない。問題を発見できても「そこがリファレンスなのか?!」と判るのにも時間がかかる。
問題の一例:
という「配列の配列」を作ったとして、
さて、それぞれ、どのように記述すればいいでしょうか?
ラクダ本はこの問題のために丸々1章を割いている、という事を新しいラクダ本を読んで確認する。それだけでも心構えが変わるはずだ。
fjの教祖様
Re:やり直すと考えずに、1からはじめると考えればいいのでは (スコア:1)
プログラミングPerlの第3版が出たのは2002年ですからねぇ。
私はperl5が出る前からperlを使ってますけど、実はperl5に本格的に移行を始めたのはほんの数年前からだったりします。
step 1. ダブルクオート文字列中の@に注意してるだけの、perl4でも動くようなコード
step 2. use strict して my で変数宣言。
step 3. ライブラリの利用で require をやめて use でモジュールを使うように
step 4. リファレンスによる多重配列なんかを使うように
step 5. 自分で書くコードもモジュール化
って流れですね。step2は早かったですが、その段階が長く(Jcode.pmは使わずにjcode.plを使ったりとか)
プログラミングPerl第3版を読んでから、step3・4に進みました。
で、step5に進んだのが3年前ぐらい?
フレームワークという怪物 (スコア:2, すばらしい洞察)
Re:フレームワークという怪物 (スコア:1)
ここで便乗質問ですが、
Perlなフレームワークについての、なにかいい書籍とかはないですかね。
そもそもCPANは巨大すぎて何でもありすぎて逆に困ったり。
××したい→CPANで探す→○と△と□と☆があると判明→どれがいいの?どう違うの?
って感じで途方にくれたりとか。
簡単なライブラリなら全部使ってみて比べることもできるけど、
大きいものだと、気軽に試しにくいんですよね…
Re:フレームワークという怪物 (スコア:1)
dankogai のブログを読む (スコア:1, 興味深い)
「404 Not Found [livedoor.jp] 」にはモダン Perl の書き方やモダン Perl の良書紹介エントリがたくさんあるので、まずはここを見るのが筋だと思う。
# dankogai の Perl 至上主義は老害と言ってもいいと思うので AC
Re:dankogai のブログを読む (スコア:2, 興味深い)
Perlは古き良きハッカー精神の賜物なので、手抜きは非常に重要視されてきました。
この緩さがPerlのいいところなのだと思うんだが、最近はSM的言語仕様を好むマゾヒストが増えてきたようで悲しいことです。
Re:dankogai のブログを読む (スコア:1, 参考になる)
Re:dankogai のブログを読む (スコア:1, すばらしい洞察)
慣れてくれば、変数などほとんど作らなくなります、($_, @_ を活用)
・・・というのは悪いPerlの例でしょうか
各LLの日本語対応 (スコア:2, 参考になる)
Rubyはシェバングに-Kオプション
Pythonはシェバングの次の行辺りで
Windowsなら
Perlはライブラリの読み込みの所辺りで
Windowsなら
PHPは……6からICUが搭載されますので、それまでお待ちください。
だいたい、こんな感じかな。
Re:各LLの日本語対応 (スコア:1, すばらしい洞察)
ruby の引数での指定方法では、ライブラリのキャラクタセットをどうするんだろう。
python の場合はソースごとに個別の指定が出来るので、モジュールA を UTF-8、モジュールB を EUC-JP、自分のソースを Shift-JIS でコーディング出来るんだよね。
ruby に戻ると、複数のモジュールのキャラクタセットを合わせないと駄目だと思うんだけど、それって UTF-8 縛りを求めてる perl とどこが違うの?と思う。
Re:各LLの日本語対応 (スコア:2, 参考になる)
親コメントにある、引数やshebangでのエンコーディング指定(-Ks, -Kuなど)は古い方法です。
1.9系のRubyではPython同様にマジックコメントによる指定方式がサポートされています。
参考 http://doc.loveruby.net/refm/api/view/spec/m17n#script_encoding [loveruby.net]
Re:dankogai のブログを読む (スコア:1)
例えば、UTF-16で書いたときも同じようにすれば解釈してくれるの?
1を聞いて0を知れ!
とりあえず (スコア:1)
# 未だにcgi-libとか使ってくる奴を見ると蹴り飛ばしたくなる
Re:とりあえず (スコア:1, すばらしい洞察)
タレこみした AC さんが、その辺もごっちゃになってしまうくらいに「久しぶり」なのだな、と理解しました。
Re:蹴り飛ばされに来たよ! (スコア:2)
同じく。
顧客から「CGI を直してくれ」と言われて調べてみると、
Perl が 5.6 だったり MySQL が 3.23 だったり…
ハードウェアを更新する気が無いんなら、レンタルサーバにしようよ。
まずは基礎固め (スコア:1, 参考になる)
「モダンPerl入門」は私も読みましたし、良い本だとは思いますが
jcode.pl 時代の感覚で読むのは少々つらいかと
あえて、モダンじゃないけど「続・初めてのPerl」を推します。
初めて とあるので、今更と思うかもしれませんが
リファレンスとオブジェクトをしっかりおさえておくのが先決だと思います
# 翻訳タイトル悪いよね
Re:まずは基礎固め (スコア:2, 参考になる)
同感です。
ラクダ本の3版で、5.6で文法的に追加された要素や雰囲気を調べてから、perldeltaで5.8や5.10での差分を、特にこの辺りで色々と変わった文字や文字コードの扱い(UnicodeとかIOレイヤーとか、Encodeとかencodingプラグマとか。)を重点的につかみ、(あと色々便利になったことを眺めたりしつつ、)その上で「モダンPerl入門」に進むというのがいいのではないかと。
また、「Perlプログラミング救命病棟」という本で主に取り扱っているのが、「古いPerlコードを引き継いでそれを今風に書き直してメンテナンスする方法」なので、新旧の差分を追いかけるにはいいかも知れません。
ところで今、きれいで実用的なPerlでオブジェクト指向のコードを書こうとしたら何を使うのがいいんでしょう。
あるいは諸氏は何を使われていますか。
(「RubyかPythonに乗り換え」というのはそれはそうなのかも知れませんが。)
「モダンPerl入門」ではMooseが紹介されていましたが、今なお普段書くコードは、素直なblessしたハッシュリファレンスに少し自前で初期化コードとかアクセサ生成コードを足したようなものです。
TIMTOWTDIとはいえ、だからこそ聞いてみたい感じがあります。
Re:まずは基礎固め (スコア:1)
言っても言っても信じてもらえないんですが、今僕の書いているすべてのコード(納品とかしてるものも含め)全部Mooseです :)
Re:まずは基礎固め (スコア:2)
Shika に関しては既に終了したプロジェクトです。
Mouse に関しても Moose の load 時間やメモリ消費が気になる時に、 Moose の代わりとして使える物です。
基本的には Moose を使う事が強く薦められています。
use Moose した時の速度が気になる CGI などの用途でしたら Mouse を選択するのがありでしょう。
将来的に Moose の読み込み時の速度が向上した等の時には Mouse は用済みのプロジェクトになる事は確定でしょうが
その時の為に直接 Moose/Mouse を使うのではなく Any::Moose というラッパー経由で使うと移行が楽になると思います。
Moose まわりの詳しいお話はこちらの記事とかどうぞ。
http://gihyo.jp/dev/serial/01/modern-perl/0004 [gihyo.jp]
また Mouse を利用して CGI/FastCGI むけのフレームワークの記事もあります。
なんで Mouse を選択したかの説明も次回以降に説明されるかもしれません。
http://gihyo.jp/dev/feature/01/perl_ark/0001 [gihyo.jp]
Re:まずは基礎固め (スコア:1)
古い人間なので、Class::Accessor::Fast [cpan.org]使ってます。
自家製モジュールはMojo::Base [cpan.org]のコピー品に以下のコードを拡張して、
みたいに使ってます。
Re:まずは基礎固め (スコア:1)
「続・初めてのPerl」は良いですよね。とりあえずこれを読んでから「Perlベストプラクティス」を読んで「悪いコードの例、良いコードの例」を知るのが良いのではないでしょうか。
でもってがっつり自分でモジュール作るなら「実用 Perlプログラミング」まで読むと一通りのことは習得できるかと。
古い書籍ですが (スコア:1)
私がPert5の世界に足を踏み入れた時には、「Perlモジュール活用ガイド」にお世話になりました。
モジュールを使うだけでなく、まがりなりにも作ることができているのはこの本のおかげです。
ちょっとオフトピですが、新しい言語を覚えるお話で。 (スコア:0)
自分がそういう人間なので体験談的に。
Perlをはじめて覚えた頃ってまだまだプログラミング自体にあまり経験がなかったものだから、他人のPerl codeを読んだり、man perlしてman perlfuncしてとりあえず一通り読んだり、ラクダ本がいいんだよと教えられて頭から黙々と読んだりして覚えたような気がするんです。でも、最近新しい言語を使おうとするときって、今したいことを実現するためだけの物を知ろうとするだけで、その他の事はあんまりじっくりと読んでないような気がするんです。例えば、HTTPでgetしたいなぁと思ったらそういうModuleをgoogleして use HTTP::Lite てのがあるって知ったら、perldoc HTTP::Lite て打ってそれだけを読んで使うだけの知識を得て使ってそこで学習終了、という感じ。そういう弱い関わり方になってしまっていて、昔のように頭から黙々とドキュメントを読む、ということをしていない気がします。これを思ったのは、そろそろErlangもつ帰るようになろうかなぁと思ったときに、とりあえず何かを作ろうとして、それを実現するために必要な最小限の情報をドキュメントから読み取ろうとしている自分に気づいたときです。多分、自分はプログラムに関しては結構いろんなものをいじってきた記憶があるので、「あぁ、~ね。他の~でやったことあるわ」という感じで学習を端折っているのではないかという気がしたわけです。で、そういう事をしていると、なんかいろいろとよく躓くんですよね。そうして結局、躓いた所のドキュメントを探してその躓いた部分だけを学習しなおして先に進んだりしてるんです。まぁ、昔も頭からラクダ本を読んだとはいっても全部理解できているわけも無くて、躓いて読み返してたりしたわけですが、そういう時でも一度通して読んであるってのは結構良く作用していたような気がします。なので、最近の私は新しい何かを覚えるときにはとりあえず用意されているドキュメントを印刷するなり携帯にmailするなりして電車の中で読んで覚えることにしています。
Re:ちょっとオフトピですが、新しい言語を覚えるお話で。 (スコア:5, おもしろおかしい)
という実例
Re:ちょっとオフトピですが、新しい言語を覚えるお話で。 (スコア:2, 参考になる)
読みにくい原因としてパラグラフに分かれていないことかと思われたので試みに分割してみた。
自分がそういう人間なので体験談的に。
Perlをはじめて覚えた頃ってまだまだプログラミング自体にあまり経験がなかったものだから、他人のPerl codeを読んだり、man perlしてman perlfuncしてとりあえず一通り読んだり、ラクダ本がいいんだよと教えられて頭から黙々と読んだりして覚えたような気がするんです。
でも、最近新しい言語を使おうとするときって、今したいことを実現するためだけの物を知ろうとするだけで、その他の事はあんまりじっくりと読んでないような気がするんです。例えば、HTTPでgetしたいなぁと思ったらそういうModuleをgoogleして use HTTP::Lite てのがあるって知ったら、perldoc HTTP::Lite て打ってそれだけを読んで使うだけの知識を得て使ってそこで学習終了、という感じ。
そういう弱い関わり方になってしまっていて、昔のように頭から黙々とドキュメントを読む、ということをしていない気がします。これを思ったのは、そろそろErlangもつ帰るようになろうかなぁと思ったときに、とりあえず何かを作ろうとして、それを実現するために必要な最小限の情報をドキュメントから読み取ろうとしている自分に気づいたときです。
多分、自分はプログラムに関しては結構いろんなものをいじってきた記憶があるので、「あぁ、~ね。他の~でやったことあるわ」という感じで学習を端折っているのではないかという気がしたわけです。
で、そういう事をしていると、なんかいろいろとよく躓くんですよね。そうして結局、躓いた所のドキュメントを探してその躓いた部分だけを学習しなおして先に進んだりしてるんです。
まぁ、昔も頭からラクダ本を読んだとはいっても全部理解できているわけも無くて、躓いて読み返してたりしたわけですが、そういう時でも一度通して読んであるってのは結構良く作用していたような気がします。
なので、最近の私は新しい何かを覚えるときにはとりあえず用意されているドキュメントを印刷するなり携帯にmailするなりして電車の中で読んで覚えることにしています。
Re:時代は変わった (スコア:1)
@ytnobody
Re:時代は変わった (スコア:4, おもしろおかしい)
タレコミ者は真面目にモダンPerlを覚えようとしているのに、茶々をいれているだけ。
こんな指摘だけでは何の生産性もないため、意地悪な彼らにかわって、私が真面目に回答しよう、
モダンなPerlを習得したい場合、やるべき事はたった一つだけ、
「Perl6を待つ」
Re:時代は変わった (スコア:1)
コミットしているお陰だろうと思う。UTF-8 で書くことが推奨されている。
それに対して Ruby は、文字コードに関して成すべき決断を済ませていないので、
まだ Modern Ruby の名に値しない段階だろう、と考えている。