※ 引述《hws110 ( only you )》之铭言:
: ※ 引述《flu (Crazy Rhythm)》之铭言:
: : 在上面的巢状for内
: : 当 ($i, $j, $all_pat2) == ( 5, ??, 'DD0')的时候
: : 如果用下面这段:
: : #$i == 5 ;
: : #$all_pat2 == 'DD0' ;
: : # 也要让%hash已经先用my在循环外宣告为lexical scope
: : $hash{"A".$i} = [ split(//, $all_pat2) ] ;
: : 那么 @{ $hash{'A'.$i} } 就是你要的阵列
: : $hash{A5}->[0], $hash{A5}->[1], $hash{A5}->[2] 的值就是 'D', 'D', '0'
: : 详情可以看看 perlreftut
: : 或是google一下 hash of array, reference 之类的关键字
: 您好,小弟有研究一下perlreftut 与 reference http://ppt.cc/FkS0
: 参考了您的解说与以上的网址,程式码如下
: my %hash;
: my $hash_ref;
: 开档读档 while (<FILEIN>){
: if ($_ =~ /V { All = (\w+); }/){
: push (@all_pat, $1);
: }}
: for ($i=0; $i<10;$i++){
: for ($j=0; $j<3;$j++){
: $all_pat2 = substr(@all_pat[$j],$i,1);
: $hash{"A".$i} = [split (//, $all_pat2)];
: }}
: $hash_ref=\%hash;
: print "$hash_ref->{A1}[0]"; #预期是0,印出2
: print "$hash{A4}->[0]"; #预期是9,印出D
: 是打印的方式有错吗?
: 如果改成
: for ($j=0; $j<3;$j++){
: $all_pat2 = substr(@all_pat[$j],$i,1);
: $hash{"A".$i} = [split (//, $all_pat2)];
: print "$hash{A1}->[0]\n";}
: 会印出00222222222222222,
: 看起来似乎会覆蓋前面一笔的资料,是我哪里有误解或者是漏了吗?
: 感谢您~
您误会flu的意思了
flu的意思是
当 $i == 5 ;
$all_pat2 == 'DD0' ; (已经得到你第一篇print的结果)
# 下列这行可以把'DD0'这个scalar转换成array,并取reference存到hash中
$hash{"A".$i} = [ split(//, $all_pat2) ] ;
但是你却在尚未处理完之前就用split
结果当然不对
应该是要先照你的第一篇 把结果存在array里
例如: $tmp_ary[0]='010' $tmp_ary[1]='002' ......
然后再用一个for loop 把tmp_ary中的每个字串转为array存入hash
例如:
for $i (0 .. 10) {
$all_pat2 = $tmp_ary[$i];
$hash{"A".$i} = [ split(//, $all_pat2) ] ;
}
不过我个人是觉得可以把问题想得更简单一点
分为
1. 取得需要几个array
2. 建立 hash of array 以方便存取
3. 逐行读入资料 并存入array中
范例如下:
my %hash;
my $len = 0;
while (<>) {
if ( /V { All = (\w+); }/ ) {
my $in_vec = $1;
# 第一次计算需要array的数量
if ( $len == 0 ) {
$len = length($in_vec) - 1;
$hash{'A'.$_} = [] for (0 .. $len);
}
# 每读入一行就拆开存入各对应的array中
for my $i (0 .. $len) {
push @{$hash{'A'.$i}}, substr($in_vec, $i, 1);
}
}
}
for my $i (0 .. $len) {
print "A$i = @{$hash{'A'.$i}}\n" ;
}
最后建议 程式排版可以再多注意一下