2017-07-14 32 views
0

輸入文件:(分離都是標籤)正則表達式模式 - 忽略單獨標籤和grep字使用Perl

abc S12GG HLPC 
     WT4E dfs.com 512 
     SDA  djkf.com 1 
     SWEW  abc.com 1 
     SEFAW dfsga.com 1 
zyx S12YT TYSX 
     wureyu dfs.com 23 
     ASWE  djkf.com 10 
     werse  abc.com 16 
     SDSDFS dfsga.com 19 

我創建一個哈希表的第一行作爲一個鍵,在第二行,只是第一個字作爲關鍵。下面是代碼:

sub readFile { 
    my ($fileName, $hash) = @_; 
    my $lines=0; 
    my $key; 
    my $buffer; 

    open (INPUT, $fileName); 
    while($buffer=<INPUT>) { 
     $lines++; 
     if ($buffer=~/^(.*)\t(.*)\t(.*)$/) { 
      $key=trim($1).";".trim($2).";".trim($3).";"; 
      $buffer=<INPUT>; 
      $lines++; 
     } 
     $buffer=~/\t(.+)\t(.+)\t(.+)/; 
     my $item=trim($1); 
     my $group=trim($2); 
     my $colinfo=trim($3); 
     $hash->{$key}{$item}=["$group","$colinfo"]; 
    } 
    close (INPUT); 

    return $lines; 
} 

但這一次無論是在if條件的行匹配:

if ($buffer=~/^(.*)\t(.*)\t(.*)$/) 

這兩個

abc S12GG HLPC 
     WT4E dfs.com 512 

燦如果條件匹配只有第一線匹配??我很困惑,很久沒有打破我的想法。

https://regex101.com/r/v6JuDb/1/

我試圖用它來幫助。但找不到任何解決方案。幫助將不勝感激。謝謝。

回答

1

而不是(.*),使用([^\t]+),因此它不會匹配整個TAB分隔符,並且它必須至少匹配一個非TAB字符。

+0

我從'*''到+'改變了,我覺得應該這樣做。 – Barmar

+0

謝謝barmar,這個作品... – blackfury

3

的方式我會做到這一點:

chomp($line); 
if (!/^\t/) { 
    $key = $line; 
    next; 
} 

my (undef, $item, $group, $colinfo) = split(/\t/, $line); 
$hash->{$key}{$item} = [ $group, $colinfo ]; 

或者如果密鑰格式實際的問題,

chomp($line); 
my @fields = split(/\t/, $line, -1); 
if ($fields[0] ne "") { 
    $key = join(';', @fields); 
    next; 
} 

my (undef, $item, $group, $colinfo) = @fields; 
$hash->{$key}{$item} = [ $group, $colinfo ];