アカウント名:
パスワード:
perlを始めるときに最初に買ったのがラマ本、その後ラクダ本に移って、今でもこの二冊だけが紙媒体のリファレンスです。頻度はぐっと落ちたとは言え、今でも月に一度はラマ本を読み返さざるを得ないヘタレなレベルである、ということで読んでもらうとして…。
(速いマシンなら)必要十分なスピードで実行してくれるし、誰かからの要望や自分の欲求の八割はperlでカバーできたりと、私にとってperlは、超一級ではないけれど、十分な品質の工具がつまった工具箱って感じで愛用しています。
ただ今まで、「この関数はリストコンテキストだと何返してくれるんだっけ? -> おっと予想外にも○○だった」とか、「なんか変な値になってるぞ -> おや、スカラーコンテキストで評価されてるぞ」とか、柔軟な記法を許しているが故に、「予想とは違うインタープリットをされた」などの苦い経験をしています。
# 苦い経験を「している」であって「させられている」ではないです。 # そのへん、ちゃんと自覚があります、ハイ。 :)
痛い思いをする原因の多くが自分の知識不足であるのは間違いないんです。ただそういうのを覚えるよりは、括弧をどんどん使って演算子の順位を明確にしたり、scalar()使って明示的に型変換(ちょっと違うな)するなど、暗黙の(=perlの常識的な)インタープリットをさせない記法で痛い思いを回避するようになりました。制限のきつい不自由なプログラミングを積極的に心掛けています。
参考にあげて下さった本のコードの「硬さ」と、私の「積極的不自由記法」とは方向性が違うかもしれませんけれど、参考になりそうなところがありそうなので、読んでみたいと思います。どうもありがとうございした。
scalar()使って明示的に型変換(ちょっと違うな)
何が嫌いで何が好きなのか、perlが柔軟ってどういうことなんだろうか、と考えを巡らせたはずなのに、いま読み返すと記法の柔軟性についてしか、書いていませんね。
そもそも自分の問いがしっかりしていないので、答えは出ませんけれど、いいきっかけを作って下さったことに感謝です。
# 隣の芝生から眺めてみるってのも、有効だよ、きっと。pythonあたり行ってみよーか > 自分
sub which_context{ print( wantarray() ? 'array' : 'scalar' ); } grep { &which_context } 1;
アホだから、関数は関数に、サブルーチンはサブルーチンに見えないと思考が止まるんです。
違うかな。確かに関数として引数を取らないというのは、奇妙にも感じますが。目grepすると、waitも引数を取りませんね。枝葉ですけれど、楽しいので突っ込み返します。
などと書いて、さらなる補強材料を探していたら、ラクダ本「2.5.1 項とリスト演算子(左方向)にはこんなことが書いてありますね。perlop(1)の「Terms and List Operators (Leftward)」の相当部分です。
項(term)は、Perlでは最も高い優先順位を持っている。項には、変数、クォート、クォート風の演算子、カッコで囲んだ式、引数をカッコで囲んだ関数が含まれる。実際には、この意味では関数と言うものは存在しない。存在するのは、引数の回りにカッコを置くことによって、関数のような振る舞いをするリスト演算子と単項演算子である。
壊れそうです。perlがまた分からなくなりました。「wantarryは関数である」は撤回します。(自分であとで読み返せるように、ここから上は書き換えません)
泣きたくなってきました。母さん、ラクダは凶暴です。
もしお時間があったら、おつきあい下さいますか。放置や、Larryに聞け!!も可 :) 。
ラクダ本「2.5 演算子」冒頭には、演算子とは項を組み合わせたり、修飾するものである(要約)とあります。
(単|二|三)項演算子という分類方法がありますが、修飾する項の一切の引数を取らないwantarray演算子は、どんな項を修飾しているんでしょうね。
例えば、chopだと次のようなシンタックスです。三番目の記法は、一番目の記法で$_を省略した記法なわけで、どちらも単項演算子です。さて、wantarrayは?
### 以下完全に独り言(読み返し用) ### # whatarray( @_ )はsyntax error # リストをchopできるってさ、フム # 「3章関数」P161 「関数のことを前置の演算子と考えることもできる。われわれは2回に1回の割合で、関数のことを演算子と呼んでいる。」フムフム # 落ち着け、「知らなくたってへっちゃらサ」だ
プレビューのつもりで送ってしまったです。
sub which_context{ print( wantarray() ? 'array' : 'scalar' ); } grep { &which_context( $_ ) } 1;
アホだから、関数は関数に、サブルーチンはサブルーチンに見えないと思考が止まります。$_はgrepかmapの中くらいでしか使わないし省略しません。m///のmは、$_相手でも省略しません。変数を評価したい時にしか、ダブルクウォートしません(たぶんbashで痛い目にあってるから)。
# 寄った本屋には無かったです。残念。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
UNIXはシンプルである。必要なのはそのシンプルさを理解する素質だけである -- Dennis Ritchie
RE: perlが嫌いなわけ (スコア:1)
>柔軟だから
>
>perlが嫌いなわけ
>柔軟すぎだから :p
同感です。うーん。
でもワタシは ダミアン・コンウェイの"オブジェクト指向Perlマスターコース" [amazon.co.jp]を読んでから
180度印象が変わりました。
サンプルにあるのは実に硬いコード。
柔軟すぎだから....硬く書く事も可能という。Perlらしい :)
Re: perlが嫌いなわけ (スコア:1)
perlを始めるときに最初に買ったのがラマ本、その後ラクダ本に移って、今でもこの二冊だけが紙媒体のリファレンスです。頻度はぐっと落ちたとは言え、今でも月に一度はラマ本を読み返さざるを得ないヘタレなレベルである、ということで読んでもらうとして…。
(速いマシンなら)必要十分なスピードで実行してくれるし、誰かからの要望や自分の欲求の八割はperlでカバーできたりと、私にとってperlは、超一級ではないけれど、十分な品質の工具がつまった工具箱って感じで愛用しています。
ただ今まで、「この関数はリストコンテキストだと何返してくれるんだっけ? -> おっと予想外にも○○だった」とか、「なんか変な値になってるぞ -> おや、スカラーコンテキストで評価されてるぞ」とか、柔軟な記法を許しているが故に、「予想とは違うインタープリットをされた」などの苦い経験をしています。
# 苦い経験を「している」であって「させられている」ではないです。
# そのへん、ちゃんと自覚があります、ハイ。 :)
痛い思いをする原因の多くが自分の知識不足であるのは間違いないんです。ただそういうのを覚えるよりは、括弧をどんどん使って演算子の順位を明確にしたり、scalar()使って明示的に型変換(ちょっと違うな)するなど、暗黙の(=perlの常識的な)インタープリットをさせない記法で痛い思いを回避するようになりました。制限のきつい不自由なプログラミングを積極的に心掛けています。
参考にあげて下さった本のコードの「硬さ」と、私の「積極的不自由記法」とは方向性が違うかもしれませんけれど、参考になりそうなところがありそうなので、読んでみたいと思います。どうもありがとうございした。
訂正 (スコア:1)
コンテキストを整える、に言い直します。何が嫌いで何が好きなのか、perlが柔軟ってどういうことなんだろうか、と考えを巡らせたはずなのに、いま読み返すと記法の柔軟性についてしか、書いていませんね。
そもそも自分の問いがしっかりしていないので、答えは出ませんけれど、いいきっかけを作って下さったことに感謝です。
# 隣の芝生から眺めてみるってのも、有効だよ、きっと。pythonあたり行ってみよーか > 自分
Re:訂正 (スコア:1)
私も困ってしまいました。
sub which_context { print wantarray ? "array" : "scalar"}
grep { which_context () } 1;
なんて書いてコマめに確認してました (:
いろいろ本を読んでみましたが、個人的なお勧めは前出のとEffective Perl [amazon.co.jp]です。
特にEffective Perlを読んでいなかったら、Perlを嫌いになってたかもしれません。
積極的不自由記法 (スコア:1)
sub which_context{
print( wantarray() ? 'array' : 'scalar' );
}
grep { &which_context } 1;
アホだから、関数は関数に、サブルーチンはサブルーチンに見えないと思考が止まるんです。
Re:積極的不自由記法 (スコア:1)
ちょっと話がそれるんですが、サブルーチンを&記法+括弧なしで呼んだ
場合、特殊変数@_の値が引き継がれるのを思い出しました。
Perlでは
some_sub() # 空の引数が(@_として)渡される
&some_sub # 現行スコープの@_がそのまま引き継がれる
の意味が違う、という。昔見事にハマッてしまいました。
関数が引数を取る時は要注意です。
あとwantarrayは演算子ですよ~。
でもwantarray()でもちゃんとインタープリットしてくれるんですね :p
# やはりPerlは柔軟でした
wantarrayは関数だと思いますが… (スコア:1)
違うかな。確かに関数として引数を取らないというのは、奇妙にも感じますが。目grepすると、waitも引数を取りませんね。枝葉ですけれど、楽しいので突っ込み返します。
などと書いて、さらなる補強材料を探していたら、ラクダ本「2.5.1 項とリスト演算子(左方向)にはこんなことが書いてありますね。perlop(1)の「Terms and List Operators (Leftward)」の相当部分です。
壊れそうです。perlがまた分からなくなりました。「wantarryは関数である」は撤回します。(自分であとで読み返せるように、ここから上は書き換えません)
泣きたくなってきました。母さん、ラクダは凶暴です。
もしお時間があったら、おつきあい下さいますか。放置や、Larryに聞け!!も可 :) 。
ラクダ本「2.5 演算子」冒頭には、演算子とは項を組み合わせたり、修飾するものである(要約)とあります。
(単|二|三)項演算子という分類方法がありますが、修飾する項の一切の引数を取らないwantarray演算子は、どんな項を修飾しているんでしょうね。
例えば、chopだと次のようなシンタックスです。三番目の記法は、一番目の記法で$_を省略した記法なわけで、どちらも単項演算子です。さて、wantarrayは?
### 以下完全に独り言(読み返し用) ###
# whatarray( @_ )はsyntax error
# リストをchopできるってさ、フム
# 「3章関数」P161 「関数のことを前置の演算子と考えることもできる。われわれは2回に1回の割合で、関数のことを演算子と呼んでいる。」フムフム
# 落ち着け、「知らなくたってへっちゃらサ」だ
積極的不自由記法 (スコア:1)
プレビューのつもりで送ってしまったです。
sub which_context{
print( wantarray() ? 'array' : 'scalar' );
}
grep { &which_context( $_ ) } 1;
アホだから、関数は関数に、サブルーチンはサブルーチンに見えないと思考が止まります。$_はgrepかmapの中くらいでしか使わないし省略しません。m///のmは、$_相手でも省略しません。変数を評価したい時にしか、ダブルクウォートしません(たぶんbashで痛い目にあってるから)。
# 寄った本屋には無かったです。残念。