- ベストアンサー
リファレンスについて。
以下の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. とエラーになる。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
多分, qw(a b c d) と ('a', 'b', 'c', 'd') と同じということで \qw(a b c d) と (\'a' \'b' \'c' \'d') が同じ扱いになってるんだろう.
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
ああ, (\'a' \'b' \'c' \'d') はもちろん (\'a', \'b', \'c', \'d') です. これがさらにスカラコンテキストで評価されるので最後の \'d' が値として使われる, と.
お礼
ご丁寧にありがとうございます。 素人にはこういった補足がとても救いになります。 どうもありがとうございました。
- zxcv0000
- ベストアンサー率56% (111/196)
確かにそうですね。 my @xx = \qw(a b c d); print map($$_, @xx), "\n"; # "abcd" と出力 文法的にはNo.2さんのおっしゃる通りみたいです。 これは私も勉強になりました。 \qw(a b c d) の代りに [qw(a b c d)] と書きましょう。
お礼
最後のコメント部分がすごく助けになりました。 ありがとうございました!
>$$yy が ARRAY なってませんけどー script 1の$$xxは$xxの間違いですか
補足
申し訳ありません。 訂正させてください。 $$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 が異なる理由が いまいちわかりません。。 片方はスカラー、片方はアレイ扱いになっているようですが。。 どう解釈すればよいのでしょうか。
お礼
ありがとうございます! 謎が氷解しました。