Re: [問題] 字串轉陣列

看板Perl作者時間12年前 (2013/04/30 22:52), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《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" ; } 最後建議 程式排版可以再多注意一下 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.15.219

04/30 23:42, , 1F
推一下^^
04/30 23:42, 1F

05/01 10:09, , 2F
原來如此,感謝您的解說,我會再試試看~感謝~
05/01 10:09, 2F
文章代碼(AID): #1HVzgIwT (Perl)
討論串 (同標題文章)
文章代碼(AID): #1HVzgIwT (Perl)