• ベストアンサー

リファレンスを用いた記述について

仮に、リファレンス値を「$hoge」とします。 通常、このリファレンスの値を参照する場合、 $$hoge とすれば取得できるかと思います。 とある参考書をみていたところ、 @{$hoge} にてリファレンス値を取得との記述がありました。 (例文:push @work,@{$hoge}) どうして、@をつけてリファレンスの指す値を取得するのか 理解できません。 リファレンスについて混乱しつつあるので、回答よろしくお願い致します。

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

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

「何のリファレンスなのか」で付ける記号は変わります。 例えば $hoge = \$foo; なら $$hoge で $foo の値が求まりますし、 $hoge = \@foo; なら @$hoge で @foo の値が得られます。 ハッシュやサブルーチンのリファレンスについても同様。

yokt
質問者

お礼

回答ありがとうございました。 分かりやすい説明で、納得できました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • zah90921
  • ベストアンサー率0% (0/2)
回答No.2

#1さんの回答に補足です。 @{$hoge}はスカラ値をとりだしているのではなく、配列を丸ごと取り出しています。配列中の個々のスカラ値を参照するには、例えば、$hoge->[0] とか、${$hoge}[0] とかで参照します。 リファレンスはC言語などのポインタと同様の概念ですので、(スカラ値である)リファレンス値は参照したいデータの先頭アドレスを示すと考えると良いでしょう。 $hogeによって参照されるデータが配列ならば@{$hoge}でその配列全体を参照しているということです。 対象がハッシュならば%{$hoge}でハッシュ全体を参照できます。

参考URL:
http://www98.sakura.ne.jp/~jun/perl/ref.html
yokt
質問者

お礼

回答ありがとうございました。 ちょっとした記述でも、奥が深いですね。 とても参考になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リファレンス点復帰について

    ど素人で申し訳ありません。 リファレンス点復帰ですが本には G28X@@Y@@Z@@; と書いており、このx、y、zで 入れたところを中間点としていったんそちらに早送りした後に、そのご指令された軸がリファレンス点に戻るということですが、 G28は単独では作動はせず、必ず後に中間点を指令しないと機能しないということでしょうか? いきなりG28だけでxyz軸がリファレンス点に戻ったりすることはなく 必ずG28の後に x y zのような値が入って使うということですか? まずG91G28Z0  G28x0y0 の私の理解ですが、一行目 まずG91ということで、インクリなので G28のあとに来ているZ0ですが、  まず一行目ではZしかないので、指令軸はZのみ そのzが0なので 移動量0つまり現在地を中間点としたのちに指令のあった軸Z軸がリファレンス点までもどる。 2行目ですが、G91はモーダルなので2行目にも効いていて 指令のアル軸はXとyでインクリでともに0なので つまり現在のxyの位置を中間点とした後に指令のあるXYの軸を リファレンス点まで戻すという理解でよろしいでしょうか? 一行目ならXYの指令がないからない軸に関しては記述がなくても 中間点は現在地と考えるのでしょうか? それよりも記述がある軸だけ今から中間点からリファレンス点という順番でうごきますよと考えるとよいでしょうか? またもし上のアブソリュートのG90G28Z0 の場合はZ0の位置までまず動いてからその後リファレンス点までうごくということですが、 そのときのZ0の位置は 加工前の設定でどこZ0にするか決めた点だと思いますが、 一般的にはワークのどこかを0と決めた ワーク座標系ですか? もしワークの上面が0だとしたら その間違いでいったんワークすれすれのところまで早送りした後 リファレンス点復帰するという理解でよろしいでしょうか? よろしくお願いします。

  • ADOのリファレンス入手方法

    みなさんいつもお世話になっています。 今までデータベースアクセスにはRecordsetを使用していたのですが、初めてCommandオブジェクトを利用したプログラミングをしてみようと思っています。 「ビギニングASPデータベース」という参考書を参考にして、色々勉強しているのですが、ParameterオブジェクトのDirectionプロパティにセットする値のことなどは詳しくは説明されていませんでした。そこでリファレンスを参考にしようとマイクロソフトのホームページなのでそれらしいものを検索してもなかなか見つかりません。 VBScriptのリファレンスなどはオンラインでもみれるし、ダウンロードも出来ますが、そのようにADOのことを色々調べられる場所をご存知ありませんか? なるべく個人で作ったホームページなどのリファレンスではなくて、マイクロソフトのホームページでの参照場所を知りたいです。どなたか情報お願いします。

  • 参照渡しやリファレンスを返す事について

    今疑問に思っているのが、「&」を付ける全ての事象についてす。 今まで参照渡しの方が効率や都合が良い場合にしか利用していませんで したが、「特に値渡しで構わない場合も、参照渡しにした方が良いの か?」という事から出てきた疑問です。 引数の値を直接操作する事はあまり良くない、と言われるのはこの辺の 絡みだと思うのですが、仮に関数内で引数の値を再セットする事を 忠実に守っていた場合、値渡しより常に参照渡しである方がメモリ 効率は良いと思います。(結局関数内で値渡しをする為、消費量としては 大きいと思いますが) 個人的には必要のある時にしか参照渡しを行わないという考えを変えるつもりは ありませんが(それが妥当な目的と利用法であると思うので)、 プロな方としてはどうなのかな、という事を思ってしまったのです。 次に、仮に変数同士で行った場合、ポインタもどきの動作をしている 事から、意味合いは通じるのですが、インスタンスを生成する場合や そのメソッドを呼び出して戻り値がオブジェクトの場合に見受けられます。 (マニュアルを見るとPHP5の場合、インスタンス生成時にそれを利用する 事は非推奨のようですが) 疑問なのは、インスタンスを初めて生成してオブジェクトが作られているのに 「&」で何を参照しに行っているのか?(クラスという雛形?) メソッドが終了したら内部の変数は開放されると思うが、それを参照 する事が何故可能なのか? リファレンス元をunset()してもリファレンス先が消えない事と同じ意味か? そういうものだと言ってしまえばそれでおしまいですが、 そういう疑問があるせいか、それの使いどころが分かりません。 加えてメソッドに関しては、呼び出し時に「&」をつけていたり メソッドの定義自体に「&」があったりして、使い方が分かりません。 呼び出し時の「&」は戻り値の参照でしょうけど、メソッド定義自体の 「&」が意味不明です。 ここばっかりはマニュアルを見ても理解出来ませんでした。 定義の参照って?という感じで考えが止まってしまいます。 (呼び出し時は、require等がされた時点でメモリで格納されている対象を見ている、という事なのか?) どなたかご教示願います。 今、かなりPHPについて悩んできてしまいました(笑)

    • ベストアンサー
    • PHP
  • リファレンスの機能

    リファレンスではサブルーチンとして呼び出すライブラリ自体を変数に格納することができるのでしょうか?その概念がよくわかりません。たとえば HOGE.plというプログラムがあり、 (1)use INILOAD; (2)$HOGE::INI = new INILOAD inifile=>'CONFIG.ini'; (3)($ret, $MESS, $s) = $HOGE::INI->load; このloadがどこのことなのか、を調べているうちにINILOAD.pmのなかにあることがわかったのです。 そこで(3)をとおった時点で$HOGE::INIの中身をlogで確認したら INILOAD=HASH(0x1857b04) が格納されていました。これってINILOAD.pmそのものを格納しているということでしょうか?だとすると上記文でなぜ$HOGE::INIのなかに ライブラリ名が格納されるのですか? 最後にINILOAD.pmのnewを記載します。 sub new { my($class) = shift; my($args) = {@_}; &init(); bless { INIFILE => $args->{inifile} || 'default.ini', }, $class; } sub init { my($self) = shift; $self->{STATUS} = 0; $self->{STATUS_MESS} = 'undefined'; undef $self->{DATA}; } おそらくbless以下の部分がキーになるのかとは思いますが、私の理解は 『ハッシュの引数の値をkey:inifile,値'default.ini'としてこのプログラム上で読めるようにし、それに$classを付加したものをINIFILE というグローバルな変数に代入する』 なのですが、どうもしっくりきません。ご指摘よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • push(@array, {}); について

    いつもお世話になります。 いまperlのプログラムを読んでいるのですが、 push(@array, {});  という記述があり@arrayという配列の最後に値を追加しているというのはわかるのですが、どんな値なのか、つまり{}の意味がわかりません。スペースでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 関数戻り値が連想配列の場合

    こんにちわ。 PHP5について質問です。 あるユーザ関数の戻り値が連想配列である場合、 ユーザ関数の実行~戻値の特定のキーの値を取得 までを1行で取得する方法があれば教えてください。 例) function hoge() {  return array("fuga" => "1", "moge" => "2"); } ここで"moge"の値を一発で参照したいと考えています。 通常では、 $result = hoge(); print $result["moge"]; のようにしていますが、これを一行で実現できる方法はありますでしょうか。

    • ベストアンサー
    • PHP
  • Excel ワークシート関数で参照セルのアドレスを固定値ではなく動的に記述したい

    皆様こんにちは。 Excel ワークシート関数で参照セルのアドレスを固定値ではなく、他のセルの値 (式の計算結果) を使用して動的に記述したいのですが、可能でしょうか。 一例ですが、 =VLOOKUP("山田 花子",Sheet2!A2:C100,3,FALSE) という式の参照先アドレス範囲開始行「2」を固定値ではなく、他のセルの値を使用して動的に記述したいのです。 また、参照先の終端である、「100」についても固定値ではなく、有効データ領域の終端を動的に取得する方法 (VBA の Worksheet.UsedRange.Rows.Count または Worksheet.UsedRange.Rows.Address に相当) が知りたいと思います。 どちらも、計算式そのものをVBAで動的に出力するのは容易なのですが、出力されたブックを手作業で編集する際の利便性も考慮すると、ワークシート関数だけで解決する方法も知っておいたほうがよいと思っています。 ご存知の方、コメントを頂けると幸いです。

  • 別の場所で記述したPHPの値参照

    同じPHPファイル内の記述なんですが <script type="text/javascript"> function test(){  <?php   //ここで下記の$idの値を取得して変数$uketoriに参照させたいです   $uketori= ????  ?> } </script> <?php $id="0123"; ?> よろしくお願いします

  • 複数のtable

    mysqlとperlを勉強中です 2つのテーブルから同じIDの情報を取得したいです。 hoge1テーブルとhoge2テーブルのIDは共通で一致しています。 (実際にはフィールドはもっと多いですがわかりやすくしています) hoge1テーブルは3つフィールドがあります ID INT1 INT2 hoge2テーブルは3つフィールドがあります ID TEXT1 TEXT2 hoge1テーブルで取得するのは数字が一致したIDです SELECT id FROM hoge1 WHERE int1=10 or int2=10 ORDER BY id hoge2テーブルで取得したいのはhoge1テーブルで取得したIDのTEXTです。やりたいことはこんな感じです SELECT TEXT1,TEXT2 FROM hoge2 WHERE id=hoge1テーブルで取得したID ORDER BY id; while (my $rec = $sth->fetchrow_array) { push(@recs, $rec); } perlでは配列で取得して後で、foreachで100個ほどprintしています。 hoge2も同じように取得したいのですが、hoge2はフォームを空白で送信できるようになっているので値がなにもないときがあります 配列に入れてしまうと空白のレコードがあるとその分、配列がずれてしまいます hoge1テーブルで取得したIDとhoge2テーブルで取得したテキストのIDを一致させる方法はありますか? やりたいのはこうゆうことです。 テーブル1で値が一致しているIDを取得する テーブル2でテーブル1で一致したIDのテキストを取得する リレーションも考えましたが素人なのでピンときませんでした テキストのほうも配列で取得して100個ほどprintしたいのです よろしくお願いします

    • ベストアンサー
    • MySQL
  • .htaccessでのリダイレクト分岐方法

    お世話になります。 .htaccessに以下の記述をしてリダイレクトしているのですが、 $1の値によってリダイレクトさせたくない場合、 どのように記述すればよいのでしょうか。 RedirectMatch permanent /abc/(.*)\.jpg$ http://hoge.com/data/$1.jpg $1の値は数字で1000以下の場合のみ先頭に0がつきます。 (500の場合は0500など) これをたとえば$1の値が0300以上(1000以下なので先頭に0がついた数値になります) ならリダイレクトさせたくないと言った事は可能でしょうか。 ・/abc/(.*)\.jpgの部分から$1の値を取得する ・取得した値で先頭に0がつく場合はまず0を排除 if($1 <= 300) { RedirectMatch permanent /abc/(.*)\.jpg$ http://hoge.com/data/$1.jpg } みたいな感じになると思うのですが、.htaccessでの記述方法がわかりません。 お手数をおかけしますがご教授いただけますと幸いです。