2014-01-09 5 views
0

파일을 읽고 필요에 따라 처리하고 있습니다. 출력물에 테이블이 있기 때문에 몇 개의 열이 정렬되지 않습니다. while 루프는 입력 파일을 처리 할 때 사용합니다.형식 출력을 perl의 출력 파일에 쓰는 중

정규 표현식 :

$_ =~ s/$var/$mod{$var}/; 
print "$_"; 

나에게 출력을 포맷하는 더 좋은 방법을 제안 해주십시오. 여기

col1 (40spaces) col2(nspaces) coln(nspaces)

그것은 내가 그것을 수행하는 방법입니다 동안() 개방 ('로그인'MYFILE를) { 경우 (조건) 내 ($ var에) = (분할()) [] ; $ var = ~ s/xyz/xy /; if ($ var = condition) $ var = $ 1; } $ _ = ~ s/$ var/$ mod {$ var} /; 인쇄 "$ _"

i need the output table 2nd column to be 40 spaces 
+0

[형식] (http://perldoc.perl.org/functions/format.html)을 고려해 보셨습니까? ([more docs] (http://perldoc.perl.org/perlform.html) –

+0

나는 sprintf를 사용합니다. 지금까지 뭐 해봤 어? – octopusgrabbus

+0

저는 완전히 초보자입니다. 그래서 출력 형식을 사용하는 것은 처음입니다. 처리가 while 루프에서 실행되고 나중에 $ _를 사용하여 인쇄되기 때문에 출력 열의 형식을 지정하는 방법이 있습니까? –

답변

2

난 당신이 각 필드에 무엇을해야, 당신은 필드에 라인을 분할해야 오히려 전체 라인에 s///을 사용하는 것보다 제안 후 출력 포맷 라인 printf를 사용하여. 이런 식으로 뭔가 :

use strict; 
use warnings; 

sub trim { $_ = shift; s/(\A\s+)|(\s+\z)//gr } # or use String::Trim 

my %full_country_name = (
    ENG => 'England', 
    SCO => 'Scotland', 
    WAL => 'Wales', 
); 

while (<DATA>) 
{ 
    chomp; 

    # Input columns are 4 chars, 5 chars, and everything else 
    my ($number, $country, $letter) = 
    map trim($_), 
    m{^ (.{4}) (.{5}) (.+) $}x; 

    # Output columns are 4 chars, 10 chars, and everything else 
    printf(
    "%-4s%-10s%s\n", 
    $number, 
    $full_country_name{$country}, 
    $letter, 
); 
} 

__DATA__ 
1 ENG A 
2 SCO B 
3 WAL C 

업데이트 :는 트림 기능의 구현을 포함하는 편집.

+0

Im에 오류가 발생하여 string/trim.pm을 찾을 수 없습니다. 버전 문제입니까? –

+0

그런 다음 String :: Trim을 설치하거나 대체 'trim'함수를 작성하십시오. 'sub trim {$ _ = shift; s/(\ A \ s +) | (\ s + \ z) // gr}' – tobyink

관련 문제