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

このQ&Aのポイント
  • Perlのリファレンスとアロー演算子について教えて下さい。
  • Perlのリファレンスとアロー演算子について教えて下さい。リファレンスとアロー演算子について勉強しているので、詳しい説明をお願いします。
  • 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.

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

http://perldoc.jp/docs/perl/5.8.8/perldiag.pod を Using an array as a reference is deprecated で検索すると、 > (D deprecated) @foo->[23] や @$ref->[99] の形で、 > 配列をリファレンスとして使おうとしました。 > 5.6.1 以前のバージョンの perl ではこの構文を許していましたが、 > そうするべきではありません。 これは今では非推奨であり、 > 将来のバージョンでは削除されるでしょう。 とあります。 昔は許されていた書き方のようです。

参考URL:
http://d.hatena.ne.jp/fbis/20080304/1204621962
kitcutter
質問者

お礼

本来,あるべき構文ではないのですね.納得致しました. ご回答いただきましてありがとうございました.

関連するQ&A

  • @のエスケープ

    スクリプト構文を大きく変更せずにabcdefghiと表示させるにはどこを修正すればよいでしょうか? [server ~/]$ uname -a FreeBSD xxxxxxx.xxxxxx.xx.jp 7.1-RELEASE-p4 FreeBSD 7.1-RELEASE-p4 #1: Mon Mar 23 17:35:54 JST 2009 admin@www200.sakura.ne.jp:/usr/obj/usr/src/sys/SAKURA11S i386 [server ~/]$ perl -v This is perl, v5.8.9 built for i386-freebsd-64int (with 1 registered patch, see perl -V for more detail) Copyright 1987-2008, 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. [server ~/]$ cat test.pl #! /usr/bin/perl $a = "abc@def@ghi"; while ($a =~ /\@/) { $a =~ s/\@//; } print "$a\n"; [server ~/]$ ./test.pl abc [server ~/]$

    • ベストアンサー
    • Perl
  • 可変変数にアロー演算子を使いたい

    例えば、 /** $hoge->appale1 は 10 $hoge->appale2 は 20 $hoge->appale3 は 30 */ このように定義されていたとします。 それを可変変数で for( $k=1; $k<=3; $k++ ){  $dynamicName = 'hoge->appele' . $k;  print "apple{$k}は" . $$dynamicName . 'です'; } のように出力したいのですが、アロー演算子を含んだ可変変数だと$hoge->apple1の数値を出力してくれません。 どのように記述すればいいでしょうか? また、可変変数で不可能であれば代案でも結構です。 お分かりになる方、ご回答お願いいたします。

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

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

    • ベストアンサー
    • Perl
  • PerlでのUseless use...

    お世話になります。 真になる演算子が1を、偽になる演算子がundefを返すことを研究しています。 print "3 == 3:【", 3 == 3, "】\n"; であれば、3 = 3が1を返すので 3 = 3:【1】 となります。 print "3 > 4:【", 3 > 4, "】\n"; であれば、3 > 4がundefになるので 3 > 3:【】 になります。 さて、and 演算子を使ったところも見たいと重い、 print "3 == 3 and 3 > 4:【", 3 = 3 and 3 > 4, "】\n"; と書いて実行すると Useless use of a constant in void context at C:\Perl\perl\showAndTF.pl line 8. という警告と共に 3 == 3 and 3 > 4:【1 と出力されてしまいます。 これはなぜでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • DBD-ODBCのインストールができません

    助けてください。 DBD-ODBCのインストールがうまくいきません。 インターネットに接続できない環境なのでオフラインで作業をしています。環境は以下の通りです。 ●perl・・・Ver.5.8.8です。 D:\Perl\bin>perl -v This is perl, v5.8.8 built for MSWin32-x86-multi-thread (with 18 registered patches, see perl -V for more detail) Copyright 1987-2007, Larry Wall Binary build 822 [280952] provided by ActiveState http://www.ActiveState.com Built Jul 31 2007 19:34:48 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. ●DBI・・・Ver.1.58です。 D:\Perl\bin>ppm query dbi レトトトトトトツトトトトトトトトトツトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトツトトトトトトソ ウ name ウ version ウ abstract ウ area ウ テトトトトトトナトトトトトトトトトナトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトナトトトトトトエ ウ DBI ウ 1.58 ウ Database independent interface for Perl ウ perl ウ タトトトトトトチトトトトトトトトトチトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトチトトトトトトル (1 package installed matching 'dbi') 現象は以下の通りです。 1.DBD-ODBCをactivestate社からダウンロードしました。   DBD-ODBC-1.13.zip 2.回答したファイルを保存しました。   DBD-ODBC.ppdとMSWin32-x86-multi-thread-5.8をd:\perl\bin配下にコピー 3.インストールを実行しました。  D:\Perl\bin>ppm install dbd-odbc.ppd 4.以下のエラーが出てできませんでした。 ppm install failed: Can't find any package that provide DBI version 1.21 for DBD-ODBC どなたか助けてください。 よろしくお願いいたします。

  • 範囲演算子(..)での少数の扱いについて、

    みなさまこんにちわ。 Perl未熟者 kokucho81です。 範囲演算子で、 @_=(0.5..3.5); とやって、 print @_; とやると、勝手に整数になっているのですけど。。。 なんで? わたしの持っている全ての参考書には、 最初の値から1づつ増やしていって、最後の値を超えない値までのリスト値を持つ、 という趣旨はかいてありますが、勝手に整数に丸めるなどと書いてある本はないのですが・・・ こういう感じで少数を配列で持つときは、どうエレガントに持てばよいのでしょうか? どうもあちこちPerlの挙動がわからんです。

    • ベストアンサー
    • Perl
  • モノイド・半群は演算が閉じている?

    モノイド・半群に付いてお尋ねします。 Wikipediaでは http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8E%E3%82%A4%E3%83%89 下記2条件のみが書かれてあります。 結合律 S の任意の元 a, b, c に対して、(a • b) • c = a • (b • c) 単位元の存在 S の元 e が存在して、S の任意の元 a に対して e • a = a • e = a 一方でモノイドは単位元をもつ半群と書かれてあります。 半群は下記の通りです。 http://ja.wikipedia.org/wiki/%E5%8D%8A%E7%BE%A4 演算が閉じている S の各元 a, b に対して、演算結果 a • b は再び S に属する。 結合律 S の各元 a, b, c に対して、等式 (a • b) • c = a • (b • c) が満たされる。 これを見るとモノイドも演算が閉じている必要があると読み取れるのですがどうでしょうか。 モノイドの方の記述が抜けているだけかと思ったのですが履歴を見るとわざわざ除外されています。 他のサイトを見てもモノイドは「演算が閉じている」と書かれているサイトを多数見かけます。 研究者によって解釈が分かれているのでしょうか。

  • obscure reference

    彼氏があまり賢くないのが嫌だ、という内容で He's good to me, and I wish I could be a simpler girl who doesn't love obscure references and librarian glasses—http://www.elle.com/life-love/ask-e-jean/advice/a29013/ask-e-jean-my-boyfriend-isnt-intellectual-enough-for-me/ obscure referenceとはどのような意味でしょうか?よろしくお願いします

  • Active Perlでsleepを使う。

    OS:Windows XP Home Edition インタプリタ:Active Perl(v5.8.8 built for MSWin32-x86-multi-thread) 簡単なスクリプトを作っていたのですが、 sleepについて質問があります。 #!/usr/bin/perl $a = 3; $b = 4; if($a > $b){ print "aが大きい"; } else{ print "bが大きい"; sleep(20); } このようなプログラムを書いたとき、 「bが大きい」が20秒遅れて表示されるのは 正しいですか? 私は「bが大きい」が表示されてから、20秒待つように 思えるのですが、実際の動きは「bが大きい」が20秒遅れて 表示されます。

    • ベストアンサー
    • Perl
  • FASTAファイルをperlでフォーマット

    >(DNA配列の描写 i.e.生物名、リファレンス番号) AGCAAAAGGGGGGGCCCCCCCCCCCCCCC 以下数行DNA配列が続く。 という繰り返しでできているFASTAファイルを 一列目を >(DNA描写) 二列目を一本のDNA配列 で表示させたい、と思っています。 while (<STDIN>){ if(/^>/){ print; }else{ chomp; chop; } }; print; としたのですが うまくいきません。 なぜなのでしょうか。

専門家に質問してみよう