作者sqrt1089 (李崩子)
看板Perl
標題[問題] while跟for的問題
時間Thu Nov 11 15:25:16 2010
首先我有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)
→ sqrt1089:另外,我把@array=("a","b","c");變成@array=("b"); 11/11 15:35
→ sqrt1089:印出是2345。 11/11 15:36
※ 編輯: sqrt1089 來自: 140.116.215.116 (11/11 15:41)
推 rkcity:<FH> 讀完一次就沒了, 不會重複讀取 11/11 17:51
→ rkcity:所以你foreach跑第二次時 while-loop根本沒跑 11/11 17:52
→ rkcity:可以先@FH = <FH> 然後針對@FH while-loop 11/11 17:52
→ sqrt1089:不懂意思XD,我的方法是把開檔丟到foreach裡面去,就是每 11/11 18:25
→ sqrt1089:for一次就開檔一次,已經快接近我要的了,只是他會記憶之 11/11 18:25
→ sqrt1089:前輸入的值, 11/11 18:25
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)
→ rkcity:我那樣講怪怪的, 應該是說<FH>讀完之後指標位置是在檔案最 11/11 18:40
→ rkcity:後面, 所以你繼續getline的結果都是空的 11/11 18:41
→ rkcity:所以你把open FH丟進foreach, 等於是每次loop都會做開檔, 11/11 18:44
→ rkcity:賦予fileheadle的動作. 當然指標位置就在檔案最前面 11/11 18:44
→ rkcity:getline就會有資料。 如果不想每次都開檔, 就先把<FH>讀進 11/11 18:45
→ rkcity:@array, 或是使用seek()做指標的移動 11/11 18:46
→ rkcity:filehandle 打錯- - 在想什麼ˊˋ 11/11 18:52
→ sqrt1089:莫名其妙的解決了,很多靈感來自於幫忙人的提示。感恩! 11/11 23:19