如果for
返回文件的完整列表然后对其进行迭代,如何在不使用next
命令的情况下跳过文件行?
就像这样的数组
my @lines = ('first line', 'second line', 'third line');
for (my $i=0; $i<=$#lines; $i++){
print $lines[$i];
$i++;
}
输出:first line
,third line
;
是否可以对文件执行相同操作而不将其推入数组?
答案 0 :(得分:1)
如何在不使用下一个命令的情况下跳过文件行?
使用你拥有的代码,你可以在那里使用一个计数器,并在每次迭代后递增它,并执行类似
的操作if($counter == 2){
#do nothing
}
else{
print $lines[$i];
}
所以在你的代码中做
for (my $i=0; $i<=$#lines; $i++){
if($i == 1){
#do nothing
}
else{
print $lines[$i];
}
}
甚至可以对文件执行相同操作而不将其推入 一个数组?
使用文件句柄打开文件
open (my $fh, "<", $filename) or die $!;
然后逐行阅读
while(my $line = <$fh>){
#work on line, apply some condition here to skip. for eg
if ($line =~ /sometext/){
#skip it using next or empty if block etc.
}
else{
#work on it
}
}
答案 1 :(得分:1)
$i++;
的要点是跳过元素。最接近的等价物:
while (my $line = <$fh>) {
print;
# Skip a line.
last if !defined($line = <$fh>);
}
目前尚不清楚你要做什么。如果你想跳过偶数行,我会选择
while (my $line = <$fh>) {
next if $. % 2 == 0; # Skip even lines
print;
}
哦等等,你说没有next
。
while (my $line = <$fh>) {
if ($. % 2) {
print;
}
}
答案 2 :(得分:0)
我有一个巨大的文件,在某些行中它必须跳过30行甚至可能我必须回到某些行... aaand我不知道行号,所以@ Chankey的方法不适合我
您可以照常阅读文件并自由使用next
命令:
open(my $fh, "filename") || die "Cant open file: $!";
while( defined(my $line = <$fh>) ) {
next if $line =~ /blablabla/;
#...
}
如果您希望能够返回某些行,我更愿意使用带有文件偏移量的数组,并在需要时调用seek
。因此,您永远不会将整个文件读入内存并仅在内存中保留“行号=&gt;偏移”数组,这可以通过不同方式进行优化。模板可以如下所示:
my $curr_line=0;
my @offsets = (0); #0th line has offset 0
open(my $fh, "filename") || die "Cant open file: $!";
while( defined(my $line = <$fh>) ) {
$offsets[++$curr_line] = tell($fh); #Save line-number => offset
next if $line =~ /blablabla/;
if( $line =~ /^return-line: (\d+)/ && $1>0 ) { #A logic which wants to go back to $1-th line
$curr_line=$1-1;
seek($fh, $offsets[$curr_line], 0);
next;
}
#...
}