2017-06-18 32 views
-1

我想读,看起来像这样一个文件的字符读取:的Perl:忽略第一线,而每个文件

> SOME HEADER 
ABCDEFGHIJKLMNOP 
QRSTUPWXYZ123456 

我需要能够读取字符A,B,C, D等字符,所以我使用这个循环:

while (read $file, my $char, 1){ 


    print $char; 
    print $.; 

    print "\n\n"; 
} 

但问题是,我需要跳过“有些头”。我需要跳过它,而不是以第一行为基础,而是基于拥有“> SOME HEADER”子字符串。

打印$。总是输出“6”,即使它不是正确的行号。

+0

显然,你需要保持一个缓冲区并检查它的子字符串,把它扔掉(清除缓冲区)。或者 - 按行读取,检查子字符串并跳过,或者用字符串处理字符串,如果这就是你所需要的...那么,为什么你按字符读取?你需要做什么? – zdim

+2

['。.'变量](http://perldoc.perl.org/perlvar.html)不适用于'read' – zdim

回答

0
open my $file,"<","file.txt"; 
<$file>; #Removing first line 
while (read $file, my $char, 1) 
{ 
    print $char; 
} 

或者设置标志,并检查它

my $flag = 0; 
while (read $file, my $char, 1) 
{ 
    $flag = 1 and next if(($char =~m/\n|\r\n/) && ($flag == 0)); 
    next if $flag == 0; 
    print $char; 
} 
0

那岂不是更容易加工线由行和然后字符一个字符?

use strict; 
use warnings; 

while (<DATA>) { 
    chomp; 
    next if /^> SOME HEADER/; 

    for my $char (split(//)) { 
     print "$char $.\n"; 
    } 
} 

__DATA__ 
> SOME HEADER 
ABCDEFGHIJKLMNOP 
QRSTUPWXYZ123456 

输出:

A 2 
B 2 
C 2 
... 
4 3 
5 3 
6 3