[問題] 問題請教

看板Perl作者 (...)時間17年前 (2008/01/11 23:09), 編輯推噓1(1019)
留言20則, 2人參與, 最新討論串1/3 (看更多)
最近開始使用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

01/12 16:05, , 1F
你的hash內容是固定,為什麼要放在loop裡面呀..
01/12 16:05, 1F

01/12 16:13, , 2F
還有你的$seq在 @A=($mw,$seq)=split(..已經把文字拿出來
01/12 16:13, 2F

01/12 16:15, , 3F
foreach $seq(@A) 就把原先的文字結果蓋掉了
01/12 16:15, 3F

01/13 23:29, , 4F
我以為foreach $seq(@A)可以取出之前存在@A裡的個別$seq
01/13 23:29, 4F

01/13 23:30, , 5F
那我該如何改寫呢?謝謝
01/13 23:30, 5F

01/14 01:59, , 6F
在foreach $seq(@A) 上面加一行 @A=split(//,$seq);
01/14 01:59, 6F

01/14 10:56, , 7F
這樣還是不行耶,他會把每個$seq拆出來的字母混在一起
01/14 10:56, 7F

01/14 13:06, , 8F
在@A=($mw, $seq)=split/\s+/;時,其實你已經取得字母部分了
01/14 13:06, 8F

01/14 13:06, , 9F
而且字母已經存成$seq, @A=split(//,$seq)是把字母在切開
01/14 13:06, 9F

01/14 13:08, , 10F
所以你其他部分都不用改,只要在foreach $seq(@A) 上面
01/14 13:08, 10F

01/14 13:08, , 11F
補上@A=split(//,$seq)就好, 補看看,我試過是沒問題
01/14 13:08, 11F

01/14 13:22, , 12F
這樣算出來的一樣是累計的耶,ACTPQK應該是-2.2而不是
01/14 13:22, 12F

01/14 13:23, , 13F
42.3(WFLIMS的44.5-2.2)
01/14 13:23, 13F

01/14 15:20, , 14F
因為你印完$sum後沒有把$sum歸零,所以會累加上去是正常的
01/14 15:20, 14F

01/14 15:21, , 15F
在print out2 "$seq $sum\n"; 下面補一行$sum = 0;
01/14 15:21, 15F

01/14 21:11, , 16F
謝謝喔,我以為每個foreach會有自己的$sum,那如何只處理有
01/14 21:11, 16F

01/14 21:13, , 17F
英文字母的列數呢?
01/14 21:13, 17F

01/14 21:52, , 18F
其實你不用煩惱這個問題,因為你是用hash,如果對應不到
01/14 21:52, 18F

01/14 21:53, , 19F
字母,自然就不會作加法的動作,
01/14 21:53, 19F

01/15 17:11, , 20F
到也沒錯,謝謝喔
01/15 17:11, 20F
文章代碼(AID): #17XuQVVZ (Perl)
討論串 (同標題文章)
文章代碼(AID): #17XuQVVZ (Perl)