2012-11-07 4 views
2

출력 형식 지정을 담당하는 Perl 코드가 있습니다. 문제는 각 문자열의 한 특정 문자 앞에 놓는 올바른 탭 수를 계산해야한다는 것입니다 (/라고 가정 해 봅시다). 그래서 다른 길이의 줄을 얻는 대신 고정 길이 문자열을 얻고 싶습니다 (가능한 한 짧게 최대 길이를 사용). 어떻게 접근해야합니까? 출력의Perl에서 출력 형식을 지정하는 방법은 무엇입니까?

예 (형식은 주석으로, 단지 원시 배열) :

Long title with some looong words/short text 
Another title/another short text 

이 같은 필요 :

title with some looong words/short text 
Different title   /another short text 

이것은 내 첫 번째 시도했다, 그러나 특정 한 문자 뒤에 탭을 사용하지 않았습니다.

my $text = Text::Format->new; 

$text->rightAlign(1); 
$text->columns(65); 
$text->tabstop(4); 

$values[$i] = $text->format(@values[$i]); 
+0

1. 모든 문자열을 반복하여 최대 길이를 찾습니다. 2. 이전에 찾은 최대 길이 3과 일치하도록 다른 문자열에 탭을 삽입하십시오. 4. 이익 – m0skit0

+0

예제 데이터를 추가하십시오. 당신이하고 싶은 것을 이해하는 것은 어렵습니다. – simbabque

답변

1

열을 줄 수 있도록, 펄의 텍스트를 포맷하는 방법은 두 일반적으로 인정 된 방법이 있습니다 :

  • 사용 printfsprintf. 아마도 이것이 가장 일반적인 방법 일 것입니다.
  • Perl Format 기능을 사용하십시오. 원하는 선을 정의한 다음 write을 사용하여 해당 형식으로 인쇄하십시오.

사람들은 수년간 Perl 형식 사양을 사용하는 것을 보지 못했습니다. 그것은 펄은 주로 슈퍼 AWK 교체 언어로 사용 되었기 때문에 큰 기능을 다시 펄 3.X의 전성기에 있었다 (P ractical E xtraction 및 RL에게 anguage를 eporting). 그러나 그 메커니즘은 여전히 ​​존재하며, 배우는 것은 재미있을 것이라고 확신합니다.


이제 조회의 두 번째 부분이 나옵니다. 단순히 텍스트를 서식 화하기 만하는 것이 아니라 의 탭으로 서식을 지정하면됩니다..

다행히 Perl에는 Text::Tabs이라는 모듈이 내장되어 있습니다. 하나 또는 두 개의 모호한 작업을 수행하지만 잘 수행하는 모듈 중 하나입니다.

사실 Text::Tabs은 잘 수행되지만 두 가지 작업을 적절하게 처리하지 못합니다.

sprintf 또는 Perl 형식 지정 기능으로 보고서를 작성하십시오. 전체 보고서를 배열에 저장하십시오. Text::Tabs은 NL을 처리하지 않으므로 배열이어야합니다. 그런 다음 unexpand 함수를 사용하여 해당 배열의 공백을 탭이있는 다른 배열로 바꿉니다.

WORD 'O 경고 : Text::Tabs 아주 나쁜 무언가를 : 그것은 당신의 허가를 요청하지 않고 프로그램에 변수 $tabstop를 가져옵니다. $tabstop이라는 변수를 사용하는 경우 변수를 변경해야합니다. $tabstop을 탭이 나타내는 공백 수로 설정할 수 있습니다. 기본값으로 8로 설정됩니다.

0

모듈 Text::Table 당신을 도울 수 있습니다.

#!/usr/bin/perl 
use warnings; 
use strict; 

use Text::Table; 

my @array = ('Long title with some looong words', 'short text', 
      'Another title',      'another short text'); 

my $table = Text::Table::->new(q(), \'/', q()); # Define the separator. 
$table->add(shift @array, shift @array) while @array; 
print $table; 
0

설명서에서 찾을 수있는 것 Text :: Format 단락 서식 만 수행합니다. 원하는 것은 표 형식입니다. 그 기본 접근 방식은 데이터를 각 행에 대한 텍스트 행렬로 분할하고 각 열에 대해 가장 긴 요소를 찾아이를 사용하여 고정 폭 데이터를 출력하는 것입니다. 예컨대 :

my @values = (
    'Long title with some looong words/short text', 
    'Another title/another short text', 
); 

# split values into per-column text 
my @text = map { [ split '\s*(/)\s*', $_ ] } @values; 

# find the maximum width of each column 
my @width; 
foreach my $line (@text) { 
    for my $i (0 .. $#$line) { 
     no warnings 'uninitialized'; 
     my $l = length $line->[$i]; 
     $width[$i] = $l if $l > $width[$i]; 
    } 
} 

# build a format string using column widths 
my $format = join ' ', map { "%-${_}s" } @width; 
$format .= "\n"; 

# print output in columns 
printf $format, @$_ foreach @text; 

이 다음을 생성합니다

Long title with some looong words/short text   
Another title     /another short text 
관련 문제