- ベストアンサー
Perlのリファレンスについて
只今、Perlを勉強中なのですがリファレンスについてご質問させて頂ます。 Perlのリファレンスについて自分でも調べてみたのですが、いまいち使い方や使うメリットがよくわかりません。 どなたかわかりやすいサンプルなどと一緒に教えて頂けないでしょうか。 どういった場面で、どのように使うと便利なのかがわかりません。 そもそもリファレンスは積極的に使うべきものなのでしょうか? Perlのオブジェクト指向で使うものなのでしょうか? C言語のポインタと似てる、と説明されてもC言語は全く知らないのでイメージがつきません。 素人でもわかるようにご教授、またはサイトの紹介をお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
まあ無責任な話ですが、使う必要がなければ使わないでいいです。 ではどういうときに使わなければならないかというと ・多次元配列を実現するとき ・↑に関連しますが、複雑なデータ構造を実現するとき ・Perlでオブジェクト指向プログラミングをするとき などです。 #多分抜けがあります。 ご自分でも検索されたとのことで、すでに見たものだったら申し訳ありませんが perlreftut - Mark's very short tutorial about references http://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html perlref - Perlのリファレンスとネストしたデータ構造 http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html あと続・はじめてのPerlあたりに詳しい話があったと思います。 今手元にないので確認できませんが。 Amazon.co.jp: 続・初めてのPerl 改訂版: 本: Randal L. Schwartz,brian d foy,Tom Phoenix,吉川 英興,伊藤 直也,田中 慎司,株式会社ロングテール/長尾 高弘 http://amazon.jp/dp/4873113059 最後に重箱の隅をつつきます :) > ご質問させて頂ます。 自分が質問する立場の場合は「ご」をつけちゃダメです。 相手の質問に答えるときはつけていいですけど。 > 素人でもわかるようにご教授 音が似ているので誤解されますがこのような場合は「教示」 を使う方がよいです。
その他の回答 (3)
- kabaokaba
- ベストアンサー率51% (724/1416)
まあ,ほんと使う必要がなければ使うことはないというところです. 書籍だったら,とりあえず既出の 「続・初めてのPerl改訂版」が定番でしょう. それだけじゃ何なので,ちょっとした例を. use strict; use warnings; sub add{ return $_[0]+$_[1]; } sub multi{ return $_[0]*$_[1]; } sub add_or_multi{ return $_[2]->($_[0],$_[1]) } print add_or_multi (1,2, \&add),"\n"; print add_or_multi (1,2, \&multi),"\n"; サブルーチンのリファレンス,いわゆるコールバックの例です. リファレンスはスカラーですので, 他のサブルーチンの引数にできます. こうすることで ちょびっとだけ違うサブルーチンの違う部分を抽出して 一個に整理できます.
お礼
返事が遅くなりすみませんでした。 特に使う場面がなければ無理に使う必要はないんですね。 他の方もお勧めしている「続・初めてのPerl」は書店で拝見したいと思います。ありがとうございました。
- g_p_
- ベストアンサー率53% (28/52)
何度もすみません。#1です。 さっきのは、ハードコーディングしちゃってて、 いまいちだったかな?と反省。 同じデータ構造を生成するヤツを。 データは不自然ですが勘弁してください。 あと、なんでそんな構造?ってのも無しでお願いします。(あくまでも例ですんで。) push @{$actors->{$family_name}} , { name => $first_name , age => $age }; この行ですが、 $actors はハッシュのリファレンスで、その値は配列のリファレンスで、 その配列に無名ハッシュのリファレンスを push してるってことになります。 で、最終的には、 $actors->{'磯野'}->[2]->{name} か $actors->{'磯野'}[2]{age} みたいに参照できます。 で、リファレンスを他の変数に代入しても良いので、 my $wakame = $actors->{'磯野'}->[3]; てすれば、 $wakame->{name} で使えます。 要は決まった形のデータ構造を繰り返している場合なんかに、 無名配列やら無名ハッシュが便利です。 なんか、便利そうな感じが分かってもらえたらいいんですが… (やっぱ分かり難くしてます?) あと、Perl のオブジェクト指向は、リファレンスを理解しとかないと辛いでしょね。 #! perl use strict; use warnings; use Data::Dumper; my $actors; while ( my $line = <DATA> ) { chomp $line; my( $family_name , $first_name ,$age ) = split /,/ , $line; push @{ $actors->{ $family_name } } , { name => $first_name , age => $age }; } print Dumper $actors; print $actors->{ '磯野' }->[ 2 ]->{ name } , 'は' , $actors->{ '磯野' }[ 2 ]{ age } ,'才' , "\n"; my $wakame = $actors->{ '磯野' }->[ 3 ]; print $wakame->{ name } , 'は' , $wakame->{ age } , '才' , "\n"; __DATA__ 磯野,波平,54 磯野,フネ,50 磯野,カツオ,11 磯野,ワカメ,9 フグ田,マスオ,28 フグ田,サザエ,24 フグ田,タラオ,3
お礼
返事が遅くなりすみませんでした。 丁寧な回答ありがとうございます。 Perlのオブジェクト指向にはリファレンスは欠かせないんですね。 少しづつ勉強していきたいと思います。
- g_p_
- ベストアンサー率53% (28/52)
こんにちは、 多分色んな方が良いアドバイスをくれるでしょうから、 難しい説明は他の方に任せます(無責任)。 以下の様なデータ構造の場合に便利っぽいですよ、 かえって分かりにくいでしょうか? $actors に無名ハッシュのリファレンスを格納してます。 で、苗字をキーにして無名配列のリファレンスを持たして、 さらにその中には、無名ハッシュのリファレンスです。 #! perl use strict; use Data::Dumper; my $actors = { '磯野' => [ { name => '波平' , age => 54 }, { name => 'フネ' , age => 50 }, { name => 'カツオ' , age => 11 }, { name => 'ワカメ' , age => 9 }, ], 'フグ田' => [ { name => 'マスオ' , age => 28 }, { name => 'サザエ' , age => 24 }, { name => 'タラオ' , age => 3 }, ], }; print Dumper($actors), qq(\n) x 2; while ( my($family_name , $members) = each %{$actors} ) { print '*' x 20 , "\n" , $family_name , '一家一覧' , "\n" , '*' x 20 , "\n"; for (@{$members}) { print $_->{name} , ' => ' , $_->{age} ,"\n"; } print "\n"; } サイトは知りませんが、 本なら、高いですけど、オライリーの「続・初めてのPerl」あたりだと思いますよ。
お礼
返事が遅くなりすみませんでした。 紹介して頂いたサイトは非常に参考になりまた。 これから少しづつ勉強していきたいと思います。 ありがとうございました。