• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:どうしてそうなるのかわからない)

perlでカレンダーを出力する方法とその動作についての疑問

このQ&Aのポイント
  • perlでカレンダーを出力する方法とその動作についての疑問です。検索して見つけたページには、Calendar::Simpleを使ったサンプルがありますが、その動作が理解できません。
  • 特に、foreach (@month)の部分での@$_の意味や、print @month[1]での出力結果について疑問があります。
  • 質問記事の中で、perlでカレンダーを出力する方法やその動作について調べていますが、いくつか疑問が生じました。特に、foreach (@month)の部分での@$_の意味や、print @month[1]での出力結果について教えてください。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

参考URLの中身を観てませんが、 質問文から @monthの中身は、配列のリファレンスの配列なのでしょう つまり、 @month =( [ 1 .. 31],[1 .. 28],[1 .. 31],[1 .. 30] ); のような感じ(上記は、1~4月)になっているのだと思います。 [ 1, 2, 3, 4]のようなものは、無名配列といって配列のリファレンス(参照)で、普通 @ary = (1, 2, 3, 4); のように配列は、書きますが、 配列のリファレンスの場合は、 $aref = [ 1, 2, 3, 4]; のように、変数としては、スカラー(単体の変数)です。 リファレンスとは、このように、配列の有り場所の場所という1つの実体を指すものなので、スカラーなのです。 そうした配列の有り場所を指す変数を配列として扱うには、 @$arefのように@を付けてやりますこれをデリファレンスといいます。 つまり、 @$_ の部分では、配列のリファレンスの配列から1つのリファレンスを取り出し、配列に戻してやっているということです。 map の中の$_は、@$_ とした時の 配列の中身の1つです。 変数をprintした時 >ARRAY(0x1afe81c) のように表示されたら、それは、配列(ARRAY)のリファレンスが格納されているということです。 サンプル: 1) $ref = [ 1 , 2, 3, 4, 5 ]; print map { $_ ? sprintf "%2d ", $_ : ' ' } @$ref; 2) $ref = [ 1 , 2, 3, 4, 5 ]; foreach (@$ref){ print "$_\n"; } 3) @ary = ( 1 , 2, 3, 4, 5 ); foreach (@ary){ print "$_\n"; } 4) @ary = ( [1,2] , [2, 3], [3, 4] ); foreach (@ary){ print map { $_ ? sprintf "%2d ", $_ : ' ' } @$_; print "\n"; }

tochanx
質問者

お礼

理解できました!わかりやすい説明、サンプルをありがとうございました! 「配列のリファレンスの配列」という表現がリンク先にもあったのですが、よくわからなかったのです。なるほど、こういうことでしたか。 助かりました・・・

関連するQ&A