Perlのリファレンスとは?

このQ&Aのポイント
  • Perlのリファレンスとは、機械語のメモリアドレス(番地)を表すものです。
  • 配列のリファレンスを使用すると、配列のメモリ領域が確保されます。
  • スカラー変数には1つのデータが入るため、5個のデータは入りません。
回答を見る
  • ベストアンサー

PARL言語のリファレンスの解釈は?

最近 学習し始めたばかりの Perl ですが、 リファレンスとは、機械語に出てくるメモリ(記憶装置)の アドレス(番地)という解釈でよいのでしょうか? (画面上16進数の番地等は表に出てこないようですが・・) また、下記サンプルの場合 リファレンスを番地と仮定しまして、 配列@arrayの番地は、5個ぶんのメモリ領域が確保されるのでしょうか? そしてスカラー$ref_arrayに代入される番地は、 その5個ぶんの番地の先頭番地でしょうか? (スカラー変数1つに、5個のデータは入らないですよね?) @array = (1,2,3,4,5); $ref_array = \@array; 表現的にわかりにくいかもしれませんが よろしくお願いします。

  • MSX1
  • お礼率100% (2/2)
  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

カテゴリーにも書いてありますが「Perl」です。 もし「Parl」という私の知らない言語なら、以下の話は無視してください。 少しだけ正しい、といったところでしょうか。 リファレンスは、機械語で例えれば、番地のようなものです。 ただ、もっと抽象的なものです。リファレンスを辿ると、参照先へアクセスできるような、なんらかの情報、くらいのものです。 実際に何が記録されているかは、ソースを読めば解るでしょうが、Perlの処理系自体を開発するのでなければ、考えなくてもいいものです。 あと、 > 配列@arrayの番地は、5個ぶんのメモリ領域が確保されるのでしょうか? > そしてスカラー$ref_arrayに代入される番地は、 > その5個ぶんの番地の先頭番地でしょうか? > (スカラー変数1つに、5個のデータは入らないですよね?) とか書いているのを見ると、機械語やC言語のような考えがあるようですが、Perlではもっと抽象的に考えてください。 順番にならんだ直線ではなく、大小関係のない面や立体的な空間の中に変数領域があるような。

MSX1
質問者

お礼

失礼しました、「PERL」でした、単なるスペルミスです。 「reference=抽象参照」とでも訳すべきでしょうか、 考えなくてもよい要素を勝手に自己解釈していました。 抽象的にとどめているぶん、逆に難しい概念ですね。 なんとなくわかりましたが、まだまだ勉強していきます。 ありがとうございました。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

まず「リファレンス」というのは「何かを参照するための情報」でしかありませんから, それが「アドレスである」とは限りません. でも, 「画面上16進数の番地等は表に出てこないようですが・・」というのは, どう試したんだろう. もう 1点. @array = (1, 2, 3, 4, 5); とした場合に, 「配列@arrayの番地は、5個ぶんのメモリ領域が確保される」とは限りません. あとで push や unshift のような操作をすることもあるので, 一般的にはもっと多めに確保しているはずです.

MSX1
質問者

お礼

ご指南ありがとうございます。 下記のように、デリファレンス演算子$を重ねずに リファレンスをprint関数処理すると、 6桁の16進数が画面表示されますが、 これがメモリアドレスかと思いましたが、 そうとは限らないのですね。 $word = "A"; $ref_word = \$word; print $ref_word, "\n"; (実行結果) SCALAR(0xa29e0c)

関連するQ&A

  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • 変数名を配列として利用するには?

    複数のモジュールに記述されている配列を1つの配列へ代入したいと思っています。 単純に考えれば、 @array = (@Module1::array, @Module2::array, @Module3::array); で良いのですが、モジュールが多岐に渡っており、モジュール名自体はスカラー変数へ代入して置き、それを利用したいと考えています。 @array = (); foreach $m (qw(Module1 Module2 Module3)) { $mn = $m. '::array'; foreach $w (@{$mn}) { # @Module1::array にアクセスしているつもり push(@array, $w); } } この様なイメージです。 しかし、@{$mn}は Can't use string ("変数名") as an ARRAY ref while "strict refs" in use at 行番号. になってしまいます。 スカラー文字列に入っている配列変数へアクセスするにはどう記述すれば良いでしょうか?

    • ベストアンサー
    • Perl
  • スカラと配列の参照を引数で渡したい。

    sub test{ my ($ref) = @_; print ref $ref; } my @a = (1, 2, "A"); #test(\"aaaa"); # SCALER #test(\['a', 1]); # REF #test(\@a); # REF # ARRAY test( \(1, 2) ); # スカラー? 引数を参照で渡すとメモリ効率?が良いと思い、スカラの場合は \"スカラー"で渡せましたが、 配列の場合は、直接 \('配列', 'です') は無理なのでしょうか? また、基本的に参照で渡すより、普通の型で渡した方がソースは読みやすいでしょうか?

    • ベストアンサー
    • Perl
  • Perlのリファレンスとアロー演算子について

    Perlの勉強をしています. リファレンスとアロー演算子について教えて下さい. ■質問 下記のうち,(4)がどのように評価されるか教えて下さい. 先頭のシャープはプロンプトです. (1) よくある配列要素の指定方法 # perl -e '@a = (0,1,2,3); print($a[1]);' →1 (2) あまりよろしくないが,スライスを使っても,print文では@a[1]がリストのコンテキストで評価されるので同じ結果にはなる # perl -e '@a = (0,1,2,3); print(@a[1]);' →1 (3) よくあるリファレンス/デリファレンスの方法 # perl -e '$a = [0,1,2,3]; print($a->[1]);' →1 (4) 下記が成り立つ意味が分からない # perl -e '@a = (0,1,2,3); print(@a->[1]);' →1 @aは配列であってリファレンスでは無いと思うのですが,配列にアロー演算子が使えてしまっていいんでしょうか? Perl5のマニュアルによれば(http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html),アロー演算子は「右側が [...] か {...} の形の添字であれば、左側は配列かハッシュへのハードリファレンスかシンボリックリファレンス」と書かれているので,左側が配列そのものであるときは,エラーになるのではないかと思うのですが... 分かる方,どなたかご教授いただければ幸いです. ■環境 # perl -v This is perl, v5.10.1 (*) built for i686-cygwin-thread-multi-64int (with 13 registered patches, see perl -V for more detail) Copyright 1987-2009, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.

  • perlのリファレンス

    Perlのクラスとそのインスタンスについて疑問があります。 newでインスタンスを生成して、それを代入した場合には オブジェクトはコピーされるのでしょうか? $a = new MyClass; $b = $a; # aをコピーしてbを作る? この状態の時にaとbが同じインスタンスを指しているのか、 コピーされた別のインスタンスを指しているのかわかりません。 コピーされるとして、逆にコピーしない方法はありますか? PHPでいうと以下の書式のことがしたいのです。 $b =& $a; リファレンスを使えばできそうですが、なんだか2回コピーしている ような気がします。 $ref_b = \$a; $b = $$reb_b; PHPでいう is_a のような関数が見つけられなかったので、 どうやって上記のことを確認すればよいのかわかりません。 Perlの代入はすべてコピーと考えてよいでしょうか? アドバイスなどいただけると幸いです。

    • ベストアンサー
    • Perl
  • c言語のmalloc関数、またrealloc関数

    c言語のmalloc関数は確保するメモリの領域を、配列としてのみしか処理出来ないのですか。 つまり、malloc関数で確保したメモリの領域を変数、また多次元配列、また構造体としては処理出来ないのでしょうか。 c言語のrealloc関数は以前の確保したメモリの領域から、確保し直したメモリの領域の場所が変わるかもしれないという事ですが、この場合の場所が変わるという意味は、メモリの領域のアドレスが変わるという事でしょうか。 また、以前の確保したメモリの領域に代入していたデータが使用出来なくなるという事でしょうか。

  • ハッシュのリファレンスを用いた処理

    ActivePerl 5.8 , WinXP SP2の環境です。 Perl スクリプトを用い、ファイルから複数のブロックからなる情報をよみとり、個別のハッシュを作り、それをリファレンスの配列としてまとめて後から参照するという操作をしたいのですが、詰まってしまいました。。 例として読み取るファイルは ---input.txt--------- >1 Jan 1 Feb 4 >2 Mar 9 Apr 3 >3 Oct 8 Nov 4 ------------------ ここから1,2,3の個別のハッシュ {Jan => 1 Feb => 4} {Mar=> 9 Apr =>3} {Oct =>8 Nov =>4} を作成し、それぞれのハッシュのリファレンスの配列をつくり、その後からすべてのハッシュの中身を個別に出力させたいと思いました。 次のようなスクリプトを作成したのですが思ったように作動しません。 use strict; open (IN, "input.txt") or die ("cant open file \n"); my $reff; my @array_of_reff; my %hash; my $count = 0; while(<IN>){ my $line = $_; ######ここでは各ブロックの頭の ">"を認識し、2個目以降であれば直前までで作ったハッシュのリファレンス($reff)を配列@array_of_reffに入れる。 if($line =~ /^>/){ if($count >0){ $reff = \%hash ; push (@array_of_reff, $reff); %hash = (); } $count++; } ########ここではアルファベットが入った行を認識して、ハッシュに追加しています if($line =~ /^[A-Za-z]/){           $line =~ /([A-Za-z]+)\s+/; my $month = $1; $line =~ /\s+(\d+)/; my $day= $1; $hash{$month} = $day;     } ###ここはファイルの最後になったら直前まで作っていたハッシュののリファレンス($reff)を配列@array_of_reffに入れる。 if( eof ){ $reff = \%hash ; push (@array_of_reff, $reff); } } #####ハッシュのリファレンスの配列(@array_of_reff)からもとのハッシュを参照し、ハッシュごとに出力 foreach my $reff_of_hash (@array_of_reff){    print "output";    while( (my $key,my $value) = each %$reff_of_hash ){     print "\n" , $key, " : ", $value, ;    } } このスクリプトを実行すると Nov 4 Oct 8 という3つめのハッシュのなかみが3回出力されてしまいます。自分では3つの別のハッシュをつくっているつもりでも、どうやら1種類しか作れていない、もしくはハッシュが上書きされているようなのですが、原因がわかりません。 この例だけ見るとハッシュのリファレンスを使う必要はないのですが、実際にはもうすこし大きいスクリプトで"ハッシュのリファレンスの配列を他のサブルーチンに渡す"ということを想定しており、これが解決できず先に進めない状態です。 アドバイス、解決法がわかったら教えていただけないでしょうか。

    • ベストアンサー
    • Perl
  • C言語の配列とポインタについて

    C言語の配列とポインタについてわからないことがあります。 以下のソース例は、10個の値の平均値を求めるプログラムです。 コメントを挟んだ部分が疑問点です。 【ソース例】 #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *data) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; /*ポインタ変数なのに? */ } return average / 10; } 【実行例】 49 このdata[i]はポインタ変数であり、 配列arrayの i 番目の要素であるarray[i]の"アドレス" が代入されているはずだと思うのですが、 なぜ通常の整数変数であるaverageと数値計算が出来、正しい結果が出たのでしょうか? あたかもdata[i]には、 array[i]の"アドレス"ではなく、 array[i]の"メモリの中身"が代入されているようです。 どういうことでしょうか? 回答よろしくお願いします。

  • ポインタに含まれる情報は [C言語]

    ポインタに含まれる情報は代入した変数のアドレスですが、アドレス元の変数の大きさは含まれないのでしょうか?ポインタの中の情報を見てみても、参照できる変数が使用しているメモリの先頭アドレスしか入っていません。変数の大きさはどうやって知るのでしょか?回答よろしくお願いします。

  • C言語におけるローカル変数が使用するメモリについて

    例のようなC言語のプログラムを動かした場合、 確保されるメモリ領域はどうなるのでしょうか。 例 #include <stdio.h> int main(void) { int a = 0; } このとき、変数aはint型なのでスタック領域に4バイトのメモリが確保されると理解しています。 と同時にaという変数名と確保されたスタック領域の番地を紐づけるようなメモリがどこかに確保されるのではないかと思ってるのですが、この理解で正しいでしょうか。 またその場合は変数aの番地はどの領域に確保されるのでしょうか。 ご教示お願いいたします。

専門家に質問してみよう