看板 Perl 關於我們 聯絡資訊
最近開始使用Perl來處理研究上的計算, 寫了如下的程式: -------------------------------------------------------------------------- use Cwd; $dir=cwd; open inf, "<$dir/RT.txt"; open out1, ">$dir/RT_output1.txt"; open out2, ">$dir/RT_output2.txt"; while(<inf>){ chomp; @A=($mw, $seq)=split/\s+/; print out1 "$seq\n"; foreach $seq(@A){ %h = ( W=> 11.0, F=> 10.5, L=> 9.6, I=> 8.4, M=> 5.8, V=> 5.0, Y=> 4.0, A=> 0.8, T=> 0.4, P=> 0.2, E=> 0.0, D=> -0.5, C=> -0.8, S=>-0.8, Q=> -0.9, G=>-0.9, N=>-1.2, R=>-1.3, H=>-1.3, K=>-1.9 ); $sum+=$h{$_} for split//, $seq; } print out2 "$seq $sum\n"; } close inf; close out1; close out2; ------------------------------------------------------------------------- 分成out1和out2只是為了檢查, 在output2裡的數值為何會是從上一列累計的啊? 問題是不是出在foreach那邊呢? 另外我想要計算的只有英文字串的部份, 該如何略過RT檔案裡的第1,4,5列呢? 附上RT.txt: http://www.badongo.com/file/7263659 煩請前輩們指點一下, 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.187.45.149
Evenni:你的hash內容是固定,為什麼要放在loop裡面呀.. 01/12 16:05
Evenni:還有你的$seq在 @A=($mw,$seq)=split(..已經把文字拿出來 01/12 16:13
Evenni:foreach $seq(@A) 就把原先的文字結果蓋掉了 01/12 16:15
muchmoa:我以為foreach $seq(@A)可以取出之前存在@A裡的個別$seq 01/13 23:29
muchmoa:那我該如何改寫呢?謝謝 01/13 23:30
Evenni:在foreach $seq(@A) 上面加一行 @A=split(//,$seq); 01/14 01:59
muchmoa:這樣還是不行耶,他會把每個$seq拆出來的字母混在一起 01/14 10:56
Evenni:在@A=($mw, $seq)=split/\s+/;時,其實你已經取得字母部分了 01/14 13:06
Evenni:而且字母已經存成$seq, @A=split(//,$seq)是把字母在切開 01/14 13:06
Evenni:所以你其他部分都不用改,只要在foreach $seq(@A) 上面 01/14 13:08
Evenni:補上@A=split(//,$seq)就好, 補看看,我試過是沒問題 01/14 13:08
muchmoa:這樣算出來的一樣是累計的耶,ACTPQK應該是-2.2而不是 01/14 13:22
muchmoa:42.3(WFLIMS的44.5-2.2) 01/14 13:23
Evenni:因為你印完$sum後沒有把$sum歸零,所以會累加上去是正常的 01/14 15:20
Evenni:在print out2 "$seq $sum\n"; 下面補一行$sum = 0; 01/14 15:21
muchmoa:謝謝喔,我以為每個foreach會有自己的$sum,那如何只處理有 01/14 21:11
muchmoa:英文字母的列數呢? 01/14 21:13
Evenni:其實你不用煩惱這個問題,因為你是用hash,如果對應不到 01/14 21:52
Evenni:字母,自然就不會作加法的動作, 01/14 21:53
muchmoa:到也沒錯,謝謝喔 01/15 17:11