2014-10-07 15 views
1

我有一個看起來像這樣的製表符分隔文件:Perl的 - 無法使用正則表達式來代替1名在TSV文件

Sample Beta Actin GAPDH Claudin  E-Cadherin 
1 1840.055 893.08  1   6387.773 
2 1862.971 48.335  1   6373.066 
3 991.598  1   2434.882 1 

我想用一個字母「X來代替「1」的每一個實例「;但我不想影響比包含數字1更長的數字。我嘗試過:

open (FILE, $file); 
while (<FILE>) { 
    my $line = $_; 
    chomp $line; 
    my @c = split('\t', $line); 
    foreach (@c) { 
      $_ =~ s/^1$/X/g; 
    } 
    print $line, "\n"; 
} 

但是,這不會更改單個字符。爲什麼這個解決方案沒有工作?如果您可以提出適用於我的問題的解決方案,我會提高您的答案,但我更感興趣的是理解爲什麼我發佈的代碼失敗。

回答

0

您正在拆分$line並修改解析的結果。

但是,你只是印刷原$line而不是從修改後的值重建它,像這樣的:

$line = join "\t", @c; 

使用也只是做原地每個字段的編輯:

use strict; 
use warnings; 

while (<DATA>) { 
    s/(?:^|\t)\K1(?=\t|$)/X/g; 
    print; 
} 

__DATA__ 
Sample Beta Actin GAPDH Claudin E-Cadherin 
1 1840.055 893.08 1 6387.773 
2 1862.971 48.335 1 6373.066 
3 991.598 1 2434.882 1 

輸出:

Sample Beta Actin GAPDH Claudin E-Cadherin 
X 1840.055 893.08 X 6387.773 
2 1862.971 48.335 X 6373.066 
3 991.598 X 2434.882 X