2014-10-07 1 views
1

I는 다음과 같습니다 탭으로 구분 된 파일이 : 나는 편지 "X로"1 "의 모든 인스턴스를 대체 할펄 - TSV 파일의 1 개의를 대체하는 정규식을 사용할 수 없습니다

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 

을 ";

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

그러나 이것은 하나의 문자를 변경하지 않습니다하지만 난 노력 숫자 1을 포함하는보다 긴 수에 영향을하고 싶지 않아요. 왜이 솔루션이 작동하지 않습니까? 내 문제에 대해 해결할 수있는 솔루션을 제안 할 수 있다면 답을 표기 하겠지만 게시 한 코드가 실패하는 이유를 이해하는 데 더 많은 관심이 있습니다.

답변

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 
관련 문제