[問題] while跟for的問題

看板Perl作者 (李崩子)時間13年前 (2010/11/11 15:25), 編輯推噓1(1015)
留言16則, 2人參與, 最新討論串1/2 (看更多)
首先我有2個檔案分別是a.txt跟b.txt a.txt內容 a 6 10 b 2 5 c 3 9 b.txt內容是:123456789abfewfwegry(就是一串字) 以下是我的程式碼(for一個輸入) ========================================================= #!/usr/bin/perl -w open (FH,"a.txt")||die"File open Error!\n"; chomp(my $input=<>); while(<FH>){ @in=split/\t/;chomp; #a.txt用tab為分隔 if($input eq $in[0]){ $x=$in[1]-1; $y=$in[2]-1; open (TXT2,"b.txt")||die"File open Error!\n"; while(<TXT2>){ @strs=split//; while($x<=$y){ $element=$strs[$x]; $x++; push(@out, $element); } } } } print @out,"\n"; 結果為:我輸入a,他先把 6跟10記錄起來,然後去記事本b找第6個~第10格元素,印出來 C:\>perl 99.p a 6789a C:\>perl 99.p b 2345 C:\>perl 99.p c 3456789 ======================以上為單輸入========================================= 現在我不要輸入了, 我就直接設一陣列內容為abc(就是我把我的輸入預設,且為多個) 以下是程式碼: #!/usr/bin/perl -w open (FH,"ttt.txt")||die"File open Error!\n"; @array=("a","b","c"); foreach $index(0..$#array){ while(<FH>){ @in=split/\t/;chomp; if( $array[$index] eq $in[0]){ # push(@output,"$in[1],$in[2]"); $x=$in[1]-1; $y=$in[2]-1; open (TXT2,"test2.txt")||die"File open Error!\n"; while(<TXT2>){ @strs=split//; while($x<=$y){ $element=$strs[$x]; $x++; push(@out, $element); } } } } print @out,"\n"; } 其結果為 C:\>perl 99.p 6789a 6789a 6789a 只存到當輸入=a的,要怎麼修飾,才會跟上面一樣結果? 道理應該是for a做一次,for b再做一次,for c再做一次,怎麼只做a而已? 有點冗長,在這先說聲謝謝。 補充 我在for迴圈加了print 看看是不是a,b,c都有做結果是有的 foreach $index(0..$#array){ print $array[$index],"\n"; while(<FH>){ .. .. .... 結果為 C:\>perl 99.p a 6789a b 6789a c 6789a 囧!~ ▂▂ ▂▂▂ ▂▄▅▅▄▆█ _█◣ ◢ (●) ◣/\\ 丫 │◥  ̄◤ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.215.116 ※ 編輯: sqrt1089 來自: 140.116.215.116 (11/11 15:27)

11/11 15:35, , 1F
另外,我把@array=("a","b","c");變成@array=("b");
11/11 15:35, 1F

11/11 15:36, , 2F
印出是2345。
11/11 15:36, 2F
※ 編輯: sqrt1089 來自: 140.116.215.116 (11/11 15:41)

11/11 17:51, , 3F
<FH> 讀完一次就沒了, 不會重複讀取
11/11 17:51, 3F

11/11 17:52, , 4F
所以你foreach跑第二次時 while-loop根本沒跑
11/11 17:52, 4F

11/11 17:52, , 5F
可以先@FH = <FH> 然後針對@FH while-loop
11/11 17:52, 5F

11/11 18:25, , 6F
不懂意思XD,我的方法是把開檔丟到foreach裡面去,就是每
11/11 18:25, 6F

11/11 18:25, , 7F
for一次就開檔一次,已經快接近我要的了,只是他會記憶之
11/11 18:25, 7F

11/11 18:25, , 8F
前輸入的值,
11/11 18:25, 8F
foreach $index(0..$#array){ #@FH=<FH>; open (FH,"ttt.txt")||die"File open Error!\n"; while(<FH>){ .. . 輸入結果為: C:\>perl 99.p a 6789a b 6789a2345 c 6789a23453456789 正在尋找,不要記憶前面輸入的相關文章。 ※ 編輯: sqrt1089 來自: 140.116.215.116 (11/11 18:28)

11/11 18:40, , 9F
我那樣講怪怪的, 應該是說<FH>讀完之後指標位置是在檔案最
11/11 18:40, 9F

11/11 18:41, , 10F
後面, 所以你繼續getline的結果都是空的
11/11 18:41, 10F

11/11 18:44, , 11F
所以你把open FH丟進foreach, 等於是每次loop都會做開檔,
11/11 18:44, 11F

11/11 18:44, , 12F
賦予fileheadle的動作. 當然指標位置就在檔案最前面
11/11 18:44, 12F

11/11 18:45, , 13F
getline就會有資料。 如果不想每次都開檔, 就先把<FH>讀進
11/11 18:45, 13F

11/11 18:46, , 14F
@array, 或是使用seek()做指標的移動
11/11 18:46, 14F

11/11 18:52, , 15F
filehandle 打錯- - 在想什麼ˊˋ
11/11 18:52, 15F

11/11 23:19, , 16F
莫名其妙的解決了,很多靈感來自於幫忙人的提示。感恩!
11/11 23:19, 16F
文章代碼(AID): #1CsvfVBj (Perl)
文章代碼(AID): #1CsvfVBj (Perl)