• ベストアンサー

Perlにはポインタという概念はありますか

C/C++等にあるポインタの概念は、Perlにはあるのでしょうか? 当方まだ間もないためか聞いたことがありません。 2次元配列があればあるとは思いますがそれも?です。

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

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

  • ベストアンサー
  • mflow
  • ベストアンサー率63% (42/66)
回答No.1

perlにはC/C++のポインタそのものはありませんが、似たようなものでリファレンス(参照)があります。 my $a = 1000; my $b = \$a; # \でリファレンスを作成、$bに$aのアドレスが代入されます。 print $$b; # $で$aの値を参照する。 結果 1000 2次元配列で使う場合はこんな感じ。 @a = ( ['google','goo'], ['adobe','microsoft'], ); print $a[0][1],"\n"; print $a[0]->[1]; # どちらでもOKです 結果 goo

myfrend
質問者

お礼

わかりやすい回答どうもありがとうございました。

その他の回答 (3)

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がると申します。 簡単にまとめますと。 ・ポインタの概念は参照という形で存在するが、ポインタ操作(演算)は出来ない ・二次元配列はないが、配列の中に配列を入れることで、「配列の配列」によって近しいことが可能である という感じになります。 Cライクに書きますと。 例えば char *pwk; char wk[] = "abc"; とあるときに、 pwk = wk; は可能ですが、例えばこれに char c; pcwk ++; /* ポインタ演算 */ c = pwk[0]; という操作は無理になります。 配列は…もしC++でSTLをご存知でしたら、いわゆる vector<vector<int> > の表現方法が、#1さんの書かれている配列の方法と等価になろうかと思います。

myfrend
質問者

お礼

ありがとうございました。

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

Perlにはリファレンスという概念があり、 これがC/C++のポインタに近いです。 2次元配列を使いたい場合は、 「配列へのリファレンス」の配列が使えます。 (Cで *array[10] で宣言されるような、ポインタの配列に相当。) ただ、Cで2次元配列を使いたいときによく使われる配列の配列(例: array[10][10])はたぶんできないと思います。 (Perlでは配列要素にはスカラーしか入らないので。リファレンスはスカラー。) でも先に述べたやり方があるのであまり問題にはならないと思います。

myfrend
質問者

お礼

#1さんの回答でなんとかできました。 どうもありがとうございました。

  • murashin3
  • ベストアンサー率42% (55/129)
回答No.2

基本的にはPerlにはポインタはありません。 ハンドルと各種の変数、演算の組み合わせでなんとかします。 (Perlには非常にたくさんの拡張モジュールがあり、その全てを 把握するのはとても困難なほどなので、中にはポインタに相当する 操作をサポートするモジュールがあるかもしれませんが・・・) 「ポインタを使わないので移植が容易」ということが この手の言語のメリットでもあるので、どうしてもポインタが 必要な実装はC/C++で行うべきと思われます。 http://www.tohoho-web.com/wwwperl.htm

myfrend
質問者

お礼

拡張モジュールを調べ、大変参考になりました。 回答ありがとうございました。

関連するQ&A

  • なぜポインタという概念が誕生したの?

    C言語には「ポインタ」という概念がありますが、そもそもなぜ「ポインタ」という概念が生まれたのですか? 「ポインタ」という概念が生まれた背景は何なんでしょうか? 当時、メモリの性能が貧弱だった為、それを有効に活用する為に生まれたのでしょうか? それに、「ポインタ」という概念がないとどうなるのでしょうか? 回答のほうよろしくお願いします。

  • perlで列の抜き出し

    a,b,c,d 1,2,3,4 5,6,7,8 以上のような配列のデータを読み込んだときに、 c 3 7 のように縦の列のデータを抜き出すプログラムを考えています。 これはどのように記述すればよいでしょうか。 二次元配列はperlでは不可能と言うことであまりperlでは難しいでしょうか。

  • ポインタみたいなもの

    Perlってポインタは利用できないんですよね。配列の要素を1つ1つ処理していってその要素の内容によって更にその配列に要素を指定した順番に追加しながら処理していくような処理を実現するにはどうしたらよいのでしょうか。C言語だったら線形リストでできるのですが。

    • ベストアンサー
    • Perl
  • LISPではperlのforeachをどのように書くのでしょうか?

    LISPでの以下の配列の配列、(LISPでは何て呼ぶのかな?)の ひとつひとつの要素を表示させたいです。 (setq dat'( ( 1 2 3 4 5) ( 6 7 8 9 10) (11 12 13 14 15) ) ) LISPではperlのforeachをどのように書くのでしょうか? # Perlの場合 foreach(@pos){ foreach($_){ print "$_\n"; } } また、配列のサイズ今回の場合は1次元配列では3,2次元配列ではサイズが5ですが、LISPで配列のサイズを求める方法も知りたいです。

  • 二次元配列のポインタについて教えて下さい

    今日はCの配列のポインタについて質問いたします、宜しくお願いします。 1次元の配列からは、 =================================== int *p , a={1,2,3}; p = &a; printf("%d\n" , p[1] ) ; printf("%d\n" , *p[1] ) ; ===================================== でaの値がとれますが、 二次元の配列では下のような書き方ではエラーになります。 何故でしょうか、どう書いてやればいいのでしょう。 ===============================================  printf("%d\n" , pbb[1][1] ) ;  printf("%d\n" , *pbb[1][1] ) ; =============================================== 宜しくお願いします。

  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

  • ポインタのポインタの初期化法

     文字列をポインタを使って扱うとき、例えば、初期化は次のように行えますよね。 #include <stdlib.h> char *s; s = (char *)malloc(1000); (これに続いてscanf("%s", s);など)  これと同様にして、二次元の配列を、ポインタのポインタを使って表したいとき、 char **s; と宣言したものを、malloc()関数を使って初期化することはできるのでしょうか。よろしくお願いします。

  • 「配列名はポインタ」という表現は間違っているのでは?

    よくネット上で、「配列名はポインタ」というような表現が出てきますが、 「配列名はポインタになっているのである。 http://www.wakhok.ac.jp/~kanayama/C/99/node111.html」 このような表現は、間違っているのではないでしょうか? C言語を作った本人によるK&Rのp.121には、次のように書かれています。 配列名とポインタの間には、心に留めておかなければならない違いが一つある。 ポインタは変数であり、したがってpa=aやpa++は意味のある演算である。   ←(1) しかし配列名は変数ではない。したがって、a=paやa++のような構文は正しくない。 ←(2) (1)より、 ポインタは、変数である ので、この対偶をとると、 変数でないものは、ポインタではない  ←(3) となります。 (2)より、 配列名は、変数ではない  ←(4) となるので、 (3)と(4)から、 配列名は、ポインタではない ←(5) となります。 そうすると、「配列名はポインタ」というような表現は間違っていることになり、誤解の元になるので、改めるべきではないかと思うのですが。

  • perlで配列のポインタをdllに渡すには?

    Active Perlの最新版(x86)を使っています。 C言語側で、 //配列の先頭要素へのポインタと配列の要素数を渡すと、要素の平均を整数で返す関数 int avr(int *array,int kazu) { int value=0; for(int i=0;i<kazu;i++) { value+=*(array+i); } return value/kazu; } などと書いて、avr.dllとしてビルドしたものを(モジュール定義はdefファイルにて指定)、 use Win32::API; my $function = Win32::API->new("avr", "avr", "PN", "N"); @array=(1,2,3,4,5); $avr=$function->Call(\@array,5); print "Content-type: text/html\n\n"; print $avr; と使ってみたのですが、出力値が期待の「3」ではなく、-123343252とか435893497などの無茶苦茶な数値になってしまいます。 配列のポインタの渡し方が違うのかとは思いますが、どう書いたら良いのか分からない状況です。 一応、他のプログラムからこのdllを使うと、正常動作するようです。

    • ベストアンサー
    • Perl
  • 多次元配列のポインタ渡し

    C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

専門家に質問してみよう