2013-04-23 2 views
1

나는 변수 $results 다음 foreach 루프에 의해 생성 한Perl에서 탭 문자로 변수를 분할하는 방법은 무엇입니까?

my $result = ""; 
foreach $c1(sort {$a<=>$b} keys %info) { 
    $result .= $c1 . "\t" . 
     join(',',@{$info{$c1}->{var1}}) . "\t" . 
     join(',',@{$info{$c1}->{var2}}) . "\n"; 
} 

나는이

a b c 
c d e 
f g h 

과 같은 결과 이렇게 거기 \t로 구분 세 개의 열이 있고 라인에 의해 분리를 인쇄하는 경우 \n. 이제이 변수를 탭으로 변수 $results으로 분할하여 3 열로 끝내기를 원합니다. while 루프를 사용하여이 작업을 시도했지만 작동하지 않습니다.

while($result){ 
    my @columns = split("\t"); 
} 

무엇이 잘못 되었나요?

답변

4

작성한 내용은 이 실제 가치 인 한 while ($result) { ... }이 계속 될 것이기 때문에 무한 루프가 발생합니다. 또한, 당신이 원하는대로 분할했다면 당신은 얻을 것이라고했을

("a", "b", "c\nd", "e", "f\ng", "h", "i") 

내가 생각하는 것은 당신이 원하는 것이 아니다.

모든 데이터를 탭과 결합한 다음 다시 분할해서는 안됩니다. 별도의 항목으로 보관하십시오. 예 :

my @results; 

foreach my $c1 (sort { $a <=> $b } keys %info) { 
    push @results, [ 
    $c1, 
    join ',', @{ $info{$c1}{var1} }, 
    join ',', @{ $info{$c1}{var2} } 
    ]; 
} 

그러면 원래 인쇄 된 데이터에 해당하는 배열의 배열을 갖게됩니다. 원하는 경우 Data::Dump을 사용하여 진단 목적으로 인쇄 할 수 있습니다.

당신은이의 정렬 열쇠 첫 번째 열의 값을 유지하려면 때문에


업데이트, 당신은뿐만 아니라 그들을 반복하기 전에 개별적으로 사람들을 저장할 수 있습니다. 아마도이 코드가 당신에게 더 어울릴 것 같습니까?

my @keys = sort { $a <=> $b } keys %info; 
my @results; 

foreach my $c1 (@keys) { 
    push @results, [ 
    $c1, 
    join ',', @{ $info{$c1}{var1} }, 
    join ',', @{ $info{$c1}{var2} } 
    ]; 
} 

이제 @keys은 원하는 값의 목록입니다.

+0

그래, 무슨 뜻인지 알 겠어. 나는 정말로 무한 ​​루프를 만들고 있었다. 하지만 이제 어떻게 첫 번째 열의 값에 액세스 할 수 있습니까? 이후 다른 파일의 값과 비교해야합니다. – user1987607

+0

'my @first = map $ _-> [0], @ results'를 사용하여 첫 번째 열의 값을 수집 할 수 있습니다. 그러나 목표를 달성하기 위해 아주 먼 길을가는 것처럼 보입니다. 나는 더 큰 그림을 보지 않고는 더 잘 도울 수 없다. – Borodin

+0

첫 번째 열에 값의 목록을 원한다면 아무것도 넣지 말고 왜 처음에'join' 표현식을 포함 시켰는지 궁금합니다. 내 대답에 당신이 선호하는 다른 해결책을 추가했습니다. – Borodin

5

인수없이 split$_ 값을 나눕니다. 원하는 경우 split(/\t/, $result);

또한 while이 잘못되었습니다. 아마도 원하는 것

for my $r (split (/\n/, $result)) { 
    @columns = split (/\t/, $r); 
    : 
관련 문제