Re: [問題] 字串轉陣列

作者: lgen7604   2013-04-30 22:51:55
※ 引述《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" ;
}
最後建議 程式排版可以再多注意一下
作者: flu (Crazy Rhythm)   2013-04-30 23:42:00
推一下^^
作者: hws110 ( only you )   2013-05-01 10:09:00
原來如此,感謝您的解說,我會再試試看~感謝~

Links booklink

Contact Us: admin [ a t ] ucptt.com