プロが教えるわが家の防犯対策術!

2次元配列のようなものについてどなたかご教授ください。

たとえば
1,2,3,4
a,b,c,d
という2行のテキストデータを読み込んで
(["1","2","3","4"], ["a","b","c","d"])
のようようなリストにはできたみたいなんですが
それをまたもとのカンマ区切りテキストにできなくて困ってます。
どこが間違ってるのでしょうか。よろしくお願いします。

open(READ,$filename) || &error("Read Error");
@BASE = <READ>;
close(READ);
@itemlist=();
foreach $num (0 .. $#BASE) {
$BASE[$num] =~ s/\n//g;
(@item) = split(/\,/,$BASE[$num]);
@itemlist = (@itemlist,[@item]);
}
#######
$dummy="";
foreach $num (0 .. $#itemlist) {
$renketu=join(",",$itemlist[$num]) ."\n";
$dummy.=$renketu;
}
open(WRITE,">$filename");
flock(WRITE,2);
print WRITE $dummy;
close(WRITE);

A 回答 (1件)

@itemlist の各要素は「配列リファレンス」なので、それを文字列として join すると「ARRAY(0x177f124)」のような文字列が連結されてしまいます。



リファレンスからデータ実体を参照するには、リファレンスが入った変数の頭に変数プリフィクス($ @ % など)を付けるだけです。
例えば配列リファレンスが入った変数 $a から、実際の配列データを見るには
  @$a
とします。
ただし、変数プリフィクスは演算子よりも先に評価されるので、$itemlist[$num] の場合は { } を使って
  @{$itemlist[$num]}
とする必要があります。
つまり、連結部分は次のようにすれば大丈夫です。
  $renketu = join(",", @{$itemlist[$num]}) ."\n";

あと、これは今回の質問と関係ありませんが、
  foreach $num (0 .. $#配列名)
という使い方は、余計なメモリを消費するので
  for (my $num = 0; $num <= $#配列名; $num++)
の方がいいです。
また、$num を要素の参照以外に使わないのなら、
  foreach $alias (@配列名)
とすれば、$alias が $配列名[$num] の代わりになります。
($alias への更新は、配列要素にも反映されます。)
# 古いPerlではダメだったかも
    • good
    • 0
この回答へのお礼

ご丁寧な解説ありがとうございます。
おかげさまでうまく動作しました。

お礼日時:2003/02/19 22:29

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