正直 Perl のこの辺の挙動はわかりにくすぎるんで、多少の間違いには目をつぶってでも自分がイメージしやすい形で理解 (モデル化?) しようと思ってしまうのである。 で、試行錯誤しつつ、今のところは以下のような感じであろうと思っている (今後また変わるかもしれないけど)。 ちなみに昨日書いた「ハッシュの中身は実質リストである」という文言は以下のオレオレモデルによるもので、どっかで読んだとか誰かにそう教えてもらったとか、そういうことではない。
で、リストコンテキスト中で配列やハッシュが評価されると、どちらもリストとして扱われる。 内部的なことはともかくとして、見た目上はやっぱり「ハッシュの中身は実質リストである」という感じ。
きむら(K)さんが「違う」と言っているのはおそらく、リストがそのままハッシュになってるんじゃなくて内部的な構造は別物でその都度変換されてるんだよ、というようなことかと思うんですが (ref.)、Perl で何か書く上で上記のような単純化した理解だけだとハマるシチュエーションとかあったらハマって苦しむ前に教えてほしいです。 なんか最近 Perl がおもしろくなってきてる自分がちょっと怖い(苦笑
あ、念の為書いておくと、もちろん「単純化した話だけでいーじゃん、詳しい説明なんて聞きたくねーよ」とか思ってるわけではないので楽しみにしてます、詳しい説明 :-)
嫌いなところは嫌いなままなんだけど、いろいろいじってるうちに今まで見えてなかったおもしろいとこが見えてきたせいで総合点は上がってきてるという感じ。
ちなみに嫌いなところってのは主に二つ。
今でもこんなもん無くなれば良いのにと思うけど、無くなったら Perl じゃないって気もしなくもない。 まあ、コンテクストはオレオレモデルでそれなりに制御できるようになってきたし、sigil (これなんて発音するのが正しいんだろ?) も慣れで何とかなるレベルではあるし、嫌いっていうだけで使う上での障害ではなくなりつつある。
もちろん細かく言えば嫌いなところはまだたくさんあるけど、そういうのは Ruby だって OCaml だってその他わしの好きな言語にもあるわけで、あえて挙げてくようなものでもない。 あ、でも最近セミコロンが必要無い言語ばっか書いてたから、セミコロン必須はツラい :-p
最近見えてきたおもしろいところっていうのは、なんというか DSL 構築能力?とでもいうもの。 サブルーチンのプロトタイプで (&) を指定しておくと sub 無しで無名関数が使えるとか、',' と '=>' という二種類のカンマとか、そういうのを使い分けて見た目を整えるとか、そんなのがなんかおもしろい。
自分でも遊びで try..catch っぽい仕組みを作ってみたりとかして遊んでたり。 なかなか思うような形にできなくて悶々としたりしてるけど(苦笑
あ、そうそう Perl を使う上で一つ困ってることがあって、それは
ということ。 もしかしたら知らないだけなのかもしれないけど、たぶん組み込みの機能としては無いよね。 きっと CPAN にはそれっぽいのがありそうな気がするけど、どうやって探したら良いんだろ。
ということで親切で暇な人のアドバイスをお待ちしております。 別に暇じゃない人でもいいですが。 親切じゃない人も…… まあお願いします。 でも「ググれ」とかだと泣きます。
Ruby に限らず変数に格納されるのが常に参照であるような言語 (関数型言語全般とか Python とか) に慣れていると、 破壊的な操作に敏感になるような気がする。 まああくまで「わしの場合」ということにしておくけど。 そういう言語では、
irb(main):001:0> a = [1,2,3,4] => [1, 2, 3, 4] irb(main):002:0> b = a => [1, 2, 3, 4] irb(main):003:0> a[0] = 5 => 5 irb(main):004:0> a => [5, 2, 3, 4] irb(main):005:0> b => [5, 2, 3, 4]
こういうことが起こるので、変なバグに悩まされないようにと思って、どうしてもこの手の破壊的操作自体を避ける傾向がある。 で、そういう思考のわしが Perl を使う場合、push とか shift とかをバンバン使ってるソースとか見ると背中がぞわぞわしてしかたがない。 でも Perl の場合そこまで気にする必要もないってことに、最近ようやく気がついた。 なんでかってーと、Perl の変数に入ってるものは敢えてそう指定しないかぎり参照じゃなくて実体だから。
pirl @> @a = (1,2,3,4) (1, 2, 3, 4) pirl @> @b = @a (1, 2, 3, 4) pirl @> $a[0] = 5 5 pirl @> @a (5, 2, 3, 4) pirl @> @b (1, 2, 3, 4)
安心。 でも、こういう挙動に慣れてないので頭がスパっと切り替わってくれないんだよなー(苦笑
なんとなく入れてみたくなったんで。
で、どうやら 5.8 とぶつからないように perl5.10 みたいにサフィックスを付けてインストールしてくれるみたい…… なのは良いんだけど、cpan-5.10 を実行してまず install Bundle::CPAN したわけですよ。 でもなんかところどころで表示される perl のパスが…… /opt/local/bin/perl になってる?
% /opt/local/bin/perl -v This is perl, v5.8.8 built for darwin-2level
OS 10.5 にしてすぐの頃に MacPorts でインストールしたものが動かなかったり色々めんどうなことがあって、そのときに PATH 環境変数で /usr/bin の方が先に来るように直したまま今まで使ってたから忘れてたけど (つまり今まではプリインストールされた /usr/bin/perl を使ってた)、MacPorts でも perl がインストールされてたんだったよ。
いやーん、と思いながら見てみれば、案の定インストールされているのは /opt/local/lib/perl5/site_perl/5.8.8/ だという。 ぐったりしながら /opt/local/bin/cpan-5.10 を見てみる。
1 #!/opt/local/bin/perl
2 eval 'exec /opt/local/bin/perl -S $0 ${1+"$@"}'
3 if $running_under_some_shell;
いくらコマンド名にサフィックス付けてもここでそれを使わなかったら意味無いよねー。 なんてがっかり品質なんだ、まったく。 しかたないからこのファイルの perl の部分を perl5.10 に書き換えて、 もっかい cpan-5.10 実行しなおし。 今度はちゃんと 5.10.0 のディレクトリにインストールされたようだ。
ところで Mac で Bundle::CPAN をインストールすると Mac::Carbon てのもインストールされるようなんだが、これのテストでいきなり「イ〜ヤ〜〜オッ!!」みたいな声がするのがビビるので勘弁してほしいと思った。
List::Util の reduce はいかがでしょうか? <br> <br>http://subtech.g.hatena.ne.jp/cho45/20080312/1205329893
おー、いー感じですね。 <br>これで幸せになれそうです。ありがとうございます。
あ、先越されてるしw >List::Util <br> <br>>楽しみにしてます、詳しい説明 :-) <br>(Cの)ソースバリバリ貼り付けても?w <br>
> (Cの)ソースバリバリ貼り付けても?w <br> <br>わりとw <br>Perl のソースは読みにくいっていう印象がありますけど、注釈付きでなら大丈夫。 <br>たぶん。 <br> <br>リストがどんな構造で、それがハッシュや配列になるとどんな風になるのか……とか結構気にはなりますよ。 <br>自分でソース読み進めてまで知りたいかってーと、そこまでではないですけど(苦笑
すんません。材料はそれなりに集まってるんですけど <br>捌いている余裕がありません○| ̄|_ <br>気長に待っておくんなまし <br>
は〜い、了解っす :-)