• ベストアンサー

Perlのリファレンスについて

只今、Perlを勉強中なのですがリファレンスについてご質問させて頂ます。 Perlのリファレンスについて自分でも調べてみたのですが、いまいち使い方や使うメリットがよくわかりません。 どなたかわかりやすいサンプルなどと一緒に教えて頂けないでしょうか。 どういった場面で、どのように使うと便利なのかがわかりません。 そもそもリファレンスは積極的に使うべきものなのでしょうか? Perlのオブジェクト指向で使うものなのでしょうか? C言語のポインタと似てる、と説明されてもC言語は全く知らないのでイメージがつきません。 素人でもわかるようにご教授、またはサイトの紹介をお願い致します。

  • Perl
  • 回答数4
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

まあ無責任な話ですが、使う必要がなければ使わないでいいです。 ではどういうときに使わなければならないかというと ・多次元配列を実現するとき ・↑に関連しますが、複雑なデータ構造を実現するとき ・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 最後に重箱の隅をつつきます :) > ご質問させて頂ます。 自分が質問する立場の場合は「ご」をつけちゃダメです。 相手の質問に答えるときはつけていいですけど。 > 素人でもわかるようにご教授 音が似ているので誤解されますがこのような場合は「教示」 を使う方がよいです。

msak777
質問者

お礼

返事が遅くなりすみませんでした。 紹介して頂いたサイトは非常に参考になりまた。 これから少しづつ勉強していきたいと思います。 ありがとうございました。

その他の回答 (3)

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.4

まあ,ほんと使う必要がなければ使うことはないというところです. 書籍だったら,とりあえず既出の 「続・初めての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"; サブルーチンのリファレンス,いわゆるコールバックの例です. リファレンスはスカラーですので, 他のサブルーチンの引数にできます. こうすることで ちょびっとだけ違うサブルーチンの違う部分を抽出して 一個に整理できます.

msak777
質問者

お礼

返事が遅くなりすみませんでした。 特に使う場面がなければ無理に使う必要はないんですね。 他の方もお勧めしている「続・初めてのPerl」は書店で拝見したいと思います。ありがとうございました。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

何度もすみません。#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

msak777
質問者

お礼

返事が遅くなりすみませんでした。 丁寧な回答ありがとうございます。 Perlのオブジェクト指向にはリファレンスは欠かせないんですね。 少しづつ勉強していきたいと思います。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 多分色んな方が良いアドバイスをくれるでしょうから、 難しい説明は他の方に任せます(無責任)。 以下の様なデータ構造の場合に便利っぽいですよ、 かえって分かりにくいでしょうか? $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」あたりだと思いますよ。

関連するQ&A

  • なぜ「C言語」にOOPが実装されなかったの?

    1972年に開発された「C言語」(C++ではない)には「オブジェクト指向」というのがないのですが、なぜ「C言語」に「オブジェクト指向」というのが実装されなかったのですか? 「オブジェクト指向プログラミング」は1960年代後半に登場していたのですが、後発の「C言語」には「ポインタ」はあっても「オブジェクト指向」というのがありません。なぜ「オブジェクト指向」は実装されなかったのでしょうか? 当時コンピュータの性能が低かったため実装が難しかったことと、まだ当時オブジェクト指向自体が無名だった為、「C言語」の開発者自体も知らなかったということもあるのでしょうか?

  • C言語の標準関数リファレンス

    C言語の勉強を始めたのですが、C言語はweb上に標準関数リファレンスはないのでしょうか? あると便利なのですが、自分で探しても見当たりませんでした。 javaのjavadocとか.netのMSDNみたいなリファレンスがあったら教えてください。 よろしくお願いします。

  • PerlでInline Cを使った配列の引渡し

    Perlで繰り返し計算をする部分を高速化しようとInline Cを使ってC言語のサブルーチンを作りました。 C言語単体なら、巨大な配列はポインタを使って引き渡すのですが。 Inline Cを使って、PerlからCへの巨大配列の引渡し方法が分かりません(><; 以下のように、リファレンスで渡してポインタで受け取る事もできないし。。。助けてください use Inline C; my @data; for(my $t=0;$t<=10000000;$t++){ $data[$t]=$t; } # C言語による処理 my $x = my_function_1(\@data); print "0から10の合計は$x\n"; __END__ __C__ // サブルーチン_1 long my_function_1(long *data){ long t; long t1=0; for(t=0;t<=10000000;t++){ t1=t1+data[t]; } return t1; }

    • ベストアンサー
    • Perl
  • オブジェクト指向の利点とは?

    汎用機でCOBOLのSEを10数年やってました。(今は自営業) COBOLはプロセス型の言語といわれているのに対して C言語はオブジェクト指向型の言語といわれています。 私はC言語やJAVAで開発したことはないのですが、 C言語、すなわちオブジェクト指向の利点ってなんでしょう? JAVA、C言語はオブジェクト指向ですよね。 私はソフトウェア開発技術者の資格など持っていますのでオブジェクト指向の表面的な意味は分かります。 ですが実際、アプリ開発時・運用時にどのような利点があるのかがイマイチ分かりません。 「どっちでもいいんじゃないか」なんて思ってしまいます。 プロセス指向(VB、COBOL等)とオブジェクト指向(C言語、JAVA)の差異って何なんでしょう。 よろしくお願いします。

  • なぜ CGI は Perl 言語で作成/動く環境が多いのか。

    最近 CGI に興味をもちここで質問しながらネット検索をしました。 すると Perl 言語での CGI サンプルが一番多く C 言語で作る CGI の サンプルが少し見つかりました。 私の使っている無料サーバーでも CGI は使えますが Perl 言語だけ有効です。 セキュリティの問題で SSI と組み合わせた C 言語の CGI は実行出来ないようです。 質問内容: (1)なぜ CGI は Perl 言語が一番多いのか?→PHP、Cもあるのに (2)なぜ無料サーバーの多くが Perl 言語しか使えないのか? (3)処理の重い CGI を使うとサーバーがダウンするので使わないようにと  私の使っている無料サーバー(infoseek)でなっています。どの程度の  処理のことでしょうか? 上記の3つまたは1つでもアドバイスをして欲しいです。 回答をお待ちしています。

    • ベストアンサー
    • CGI
  • C++の将来性・・・

    昨年まで、C++プログラマをしていました。しかし恥ずかしながらぜんぜんオブジェクト指向じゃないコードを書いていました・・・ いまJavaで仕事していて感じるのですが、C++にはガベージコレクションがないので、実はオブジェクト指向プログラミングがとてもやりにくい言語ではないですか? そうなると、C++の必然性がなくなり、C Java C# に取って代わられてC++は消え去っていく言語なのでしょうか。 「いやC++はすばらしいオブジェクト指向言語だ!」というお叱りを期待しています。

  • ポインタ

    C言語のポインタみたいなことはできないかなと思い、 <? function a ($a){ print $a; $a="z"; } $c = "x"; a(&$c); print $c; ?> と興味本位でやってみたところ、 xz と表示されました。googleで "php ポインタ" と検索してもそれっぽい解説をみつけられなかったのですが、phpではC言語のポインタっぽい挙動をみせるこの機構をなんというのでしょうか・・・?(perlではリファレンスだった)

    • ベストアンサー
    • PHP
  • Cとjavaの違い

    学校でC言語プログラミングを学んでおり,新たにjavaも習うことになったのですが, C言語とjava言語の違いはどのような所なのでしょうか? java言語は「オブジェクト指向」ですが,C言語は何指向なのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向の壁

    Java言語などは「オブジェクト指向」が売り?だと思うのですが 素人や初心者が、ぶち当たる「オブジェクト指向の壁」って何だと思いますか? 暇な時にでも回答ください。

    • ベストアンサー
    • Java
  • オブジェクト指向プログラミング学習向けのサンプルプログラム

    「これは参考になるよ」というような、 オブジェクト指向プログラミング学習向けのサンプルプログラムを教えていただけませんか? 言語はDelphiです。 Delphiに限らず、他言語(Java、C#、C++あたり)でも結構です (移植しますので、出来ればCUI、GUIが少ないものが理想です) よろしくお願いいたします。 Delphiにてオブジェクト指向プログラミングを学んでいます。 書籍等で、基本的なことは学びました。 理解度およびスキルを上げるために、実際にプログラミングしたいと思います。 (入門書を利用してや、 自分で考えながらのテスト的なプログラミングには限界を感じてまして^^;)

専門家に質問してみよう