• ベストアンサー

リファレンスについて。

以下のperlスクリプトで、どちらも私には同じ結果をもたらすものだと 予想していたのですが、出力結果が異なってしまいます。 なぜ script1 ではエラーなしで動作するのに、script 2では エラーが出るのでしょうか。 $$xx が d になり、 $$yy が ARRAY(0x180c460) となる理由も わかりません。 稚拙な質問で申し訳ありませんが、どなたかよろしくお願いしますm(_ _)m ## script 1 とします。 my $xx = \qw(a b c d); print "$$xx \n"; # d と出力される print "xx is $$xx \n"; # xx is d と出力。 ## script 2 とします。 my @array = qw(a b c d); my $yy = \@array; print "$yy \n"; # ARRAY(0x180c460) と出力される。 print "yy is $$yy \n"; # Not a SCALAR reference at tryme.pl line 11. とエラーになる。

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

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

多分, qw(a b c d) と ('a', 'b', 'c', 'd') と同じということで \qw(a b c d) と (\'a' \'b' \'c' \'d') が同じ扱いになってるんだろう.

miyakosais
質問者

お礼

ありがとうございます! 謎が氷解しました。

その他の回答 (3)

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

ああ, (\'a' \'b' \'c' \'d') はもちろん (\'a', \'b', \'c', \'d') です. これがさらにスカラコンテキストで評価されるので最後の \'d' が値として使われる, と.

miyakosais
質問者

お礼

ご丁寧にありがとうございます。 素人にはこういった補足がとても救いになります。 どうもありがとうございました。

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

確かにそうですね。 my @xx = \qw(a b c d); print map($$_, @xx), "\n"; # "abcd" と出力 文法的にはNo.2さんのおっしゃる通りみたいです。 これは私も勉強になりました。 \qw(a b c d) の代りに [qw(a b c d)] と書きましょう。

miyakosais
質問者

お礼

最後のコメント部分がすごく助けになりました。 ありがとうございました!

noname#208124
noname#208124
回答No.1

>$$yy が ARRAY なってませんけどー script 1の$$xxは$xxの間違いですか

miyakosais
質問者

補足

申し訳ありません。 訂正させてください。 $$xx は $xxの間違いでした。 もう一度、以下に質問を書き直させてください。 本当にすいません。 ## script 1 とします。 my $xx = \qw(a b c d); print "$xx \n"; # SCALAR(0x1801180) と出力される。 print "xx is $$xx \n"; # xx is d と出力。 ## script 2 とします。 my @array = qw(a b c d); my $yy = \@array; print "$yy \n"; # ARRAY(0x180c460) と出力される。 print "yy is $$yy \n"; # Not a SCALAR reference at tryme.pl line 11. とエラーになる。 $xx と $yy が異なる理由と、$$xx と$$yy が異なる理由が いまいちわかりません。。 片方はスカラー、片方はアレイ扱いになっているようですが。。 どう解釈すればよいのでしょうか。

関連するQ&A