作者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)
1F:→ sqrt1089:另外,我把@array=("a","b","c");变成@array=("b"); 11/11 15:35
2F:→ sqrt1089:印出是2345。 11/11 15:36
※ 编辑: sqrt1089 来自: 140.116.215.116 (11/11 15:41)
3F:推 rkcity:<FH> 读完一次就没了, 不会重复读取 11/11 17:51
4F:→ rkcity:所以你foreach跑第二次时 while-loop根本没跑 11/11 17:52
5F:→ rkcity:可以先@FH = <FH> 然後针对@FH while-loop 11/11 17:52
6F:→ sqrt1089:不懂意思XD,我的方法是把开档丢到foreach里面去,就是每 11/11 18:25
7F:→ sqrt1089:for一次就开档一次,已经快接近我要的了,只是他会记忆之 11/11 18:25
8F:→ 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)
9F:→ rkcity:我那样讲怪怪的, 应该是说<FH>读完之後指标位置是在档案最 11/11 18:40
10F:→ rkcity:後面, 所以你继续getline的结果都是空的 11/11 18:41
11F:→ rkcity:所以你把open FH丢进foreach, 等於是每次loop都会做开档, 11/11 18:44
12F:→ rkcity:赋予fileheadle的动作. 当然指标位置就在档案最前面 11/11 18:44
13F:→ rkcity:getline就会有资料。 如果不想每次都开档, 就先把<FH>读进 11/11 18:45
14F:→ rkcity:@array, 或是使用seek()做指标的移动 11/11 18:46
15F:→ rkcity:filehandle 打错- - 在想什麽ˊˋ 11/11 18:52
16F:→ sqrt1089:莫名其妙的解决了,很多灵感来自於帮忙人的提示。感恩! 11/11 23:19