アプリ版:「スタンプのみでお礼する」機能のリリースについて

配列@listの要素として@pickupの配列をセットしたいと思っています。

ループ文の中で繰り返し、$countというループの回数をカウントしている変数によってセットする場所を変えていきたいのです。

for($count=0;$count>100;$count++){

(中略しますが、ファイルを読み込み正規表現で値を吸い出しています)

@pickup=("$1","$2","$3");#@pickupはループごとに中身が変わります。
@list[$count] = @pickup;#ここで@listの要素として@pickupをセット
}

上記のように記述したとします。

print $list[80];とすると、@pickupの[0]の要素しか表示しません。
print @list[80];としても上に同じ。

質問1.どうやったら@list[$count]で配列の要素に配列を入れられますか?
質問2.その後どうやって配列の中の配列の要素を取り出せますか?

イメージとしては@listの50番目の要素@pickupの0番目もしくは1番目の要素を取り出したいという感じです。

A 回答 (1件)

Perlのバージョンそのものも不明(もしかしてPerl4?)ですけども,


前の質問から疑問だったんですが
例えば,配列 @file のインデックス 10 の要素は $file[10] です.
@file[10] で配列 @file のインデックス 10 の要素を
示すのは Perl6 の表記法です.
ごっちゃごちゃになってませんか?

さて,本題.
配列の要素はスカラーのみです.
したがって,配列の中に配列をそのままいれることはできません.
前の質問もそうだったのですが
Perlの「コンテキスト」という概念を理解してください.

>@list[$count] = @pickup;#ここで@listの要素として@pickupをセット
(中略)
>print $list[80];とすると、@pickupの[0]の要素しか表示しません。

これは $list[$count] (@list[$count]だとエラーになるはず)に
@pickup を「スカラーコンテキスト」で評価した値が
代入されるので,$pickup[0] が入るはずはないのです.
$#pickup つまり,@pickup の要素数が入るはずです.

配列に配列をいれるとなると
以下のような感じでしょうか.
Perl5.8を前提にしています.

use strict;
use warnings;

my $sample="123 ABC XYZ";#サンプルの文字列
my @list;

for my $count (0..1000){
$list[$count] = [ $sample=~m<(\d+) (\w+) (\w+)> ];
}

print "$list[50]->[0]\n";
print "$list[50]->[1]\n";

マッチ演算をリストコンテキストにおくと
()でキャプチャされたもののリストを返し,
それを匿名配列の生成子[]にいれて
それをスカラーコンテキストである
@lits の各要素への代入に使うことで,
匿名配列へのリファレンスを@listの各要素にいれます.

したがって,@listの各要素はそれぞれ
配列へのリファレンスとなり,
その要素へは -> でアクセスします.

明示的にデリファレンスして
${ $list[50] }[0] としてもよいのですが
やっぱりみにくいですね.
    • good
    • 0
この回答へのお礼

たびたびご回答いただきましてありがとうございます。
Perlのバージョンは5.6.1でした。

コンテキストはなかなか難しいですね。
少しはわかっているつもりでしたが、いざ作ってみて躓いて指摘されてみて初めて全然わかっていないことに気がつきました。

ご教授いただいた方法で配列へ代入することができました。
ありがとうございました。
コンテキストについて詳しく書かれているHPがなかなかないので苦労しそうですが勉強してみます。

お礼日時:2007/04/15 14:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!