2010-11-23 4 views
1

Я хочу отобразить таблицу в perl, имена строк и столбцов, для которых будет переменной длины. Я хочу, чтобы столбцы были аккуратно выровнены. Проблема заключается в том, что заголовок строки и столбца имеет переменную длину, поэтому выравнивание смещается для разных файлов.perl print formatting вопрос

Вот код, я использую формат:

print "\n    "; 
foreach (keys(%senseToSenseCountHash)) 
{ 
printf "%15s",$_; 
} 
print "\n"; 
print "------------------------------------------------------------\n"; 

my $space = "---"; 

foreach my $realSense (keys(%actualSenseToWronglyDisambiguatedSense)) 
{ 
printf "%s",$realSense; 

     foreach (keys(%senseToSenseCountHash)) 
{ 
    if(exists($actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_})) 
    { 
    printf "%15s",$actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_}; 
    } 
    else 
    { 
    printf "%15s",$space; 
    } 
} 
print "\n"; 
} 

Выходы я получаю следующим образом (для разных файлов, которые я должен проверить на):

    Microsoft   IBM 
------------------------------------------------------------ 
Microsoft   896   120 
IBM    66   661 



        SERVE12   SERVE2   SERVE6  SERVE10 
------------------------------------------------------------ 
SERVE12   319    32    19    8 
SERVE2    44   159    39    25 
SERVE6    22    9   102    1 
SERVE10    14    16    12   494 



         HARD3   HARD2   HARD1 
------------------------------------------------------------ 
HARD3    68    7    27 
HARD2    6    60    90 
HARD1    37    69   937 

Я хочу выведите этот вывод независимо от имени строки и столбца. Кто-нибудь может помочь?

Большое спасибо!

+1

Посмотрите на [Perl6 :: Форма] (http://search.cpan.org/~dconway/Perl6-Form-0.04/Form.pm), или устаревший (в Perl Best Practices) Perl [form] (http://perldoc.perl.org/perlform.html) механизм. Интересно, что Perl6 :: Form не указан в CPAN под Perl6; Я не уверен в значении этого. – 2010-11-23 04:05:50

+0

Вы можете использовать функцию formline без использования объявления формата, например, функции swrite на странице perlform, но локализации $^A – MkV 2010-11-23 09:27:16

+1

@Jonathan: Пожалуйста, не говорите людям, что вещи устарели, если только это не контролируется «устаревшим» лексическим категория предупреждений! В частности, * ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ * Perl Best Practices *, чтобы превратить людей в однородность и глупость. Это не то, о чем писала книга! Сам Дамиан Конвей говорит: «Так много людей забывают, что PBP был - в его сердце - призывом к коду, который должен быть написан любым * последовательным стилем, сознательно и рационально выбранным для удовлетворения своих собственных потребностей». ** – tchrist 2010-11-23 16:17:20

ответ

1

Нашел ответ, вставив его здесь, если кто-то захочет его использовать.

printf "%10s %-2s",'----------','|'; 

foreach(keys(%senseToSenseCountHash)) 
{ 
    printf "%s",'----------------'; 
} 
print "\n"; 

printf "%10s %-2s",'   ','|'; 

foreach(keys(%senseToSenseCountHash)) 
{ 
    printf "%-14s",$_; 
} 
print "\n"; 

printf "%10s %-2s",'----------','|'; 

foreach(keys(%senseToSenseCountHash)) 
{ 
    printf "%s",'----------------'; 
} 
print "\n"; 

foreach my $key (sort { $senseToSenseCountHash{$b} <=> 
           $senseToSenseCountHash{$a} } keys %senseToSenseCountHash) 
{ 
    $maxSense = $senseToSenseCountHash{$key}; 
    last; 
} 

my $space = "---"; 

foreach my $realSense (keys(%actualSenseToWronglyDisambiguatedSense)) 
{ 

    printf "%-10s %-2s",$realSense,'|'; 
     foreach (keys(%senseToSenseCountHash)) 
    { 
     if(exists($actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_})) 
     { 
      printf "%-15s",$actualSenseToWronglyDisambiguatedSense{$realSense}[0]{$_}; 
     } 
     else 
     { 
      printf "%-15s",$space; 
     } 
    } 
    print "\n"; 
} 

printf "%10s %-2s",'----------','|'; 

foreach(keys(%senseToSenseCountHash)) 
{ 
    printf "%s",'----------------'; 
} 
print "\n"; 

Выход:

---------- | ------------------------------------------------ 
      | HARD3   HARD2   HARD1   
---------- | ------------------------------------------------ 
HARD3  | 68    7    27    
HARD2  | 6    60    90    
HARD1  | 37    69    937    
---------- | ------------------------------------------------ 


---------- | ---------------------------------------------------------------- 
      | SERVE12  SERVE2  SERVE6  SERVE10  
---------- | ---------------------------------------------------------------- 
SERVE12 | 319   32    19    8    
SERVE2  | 44    159   39    25    
SERVE6  | 22    9    102   1    
SERVE10 | 14    16    12    494    
---------- | ---------------------------------------------------------------- 
1

Эта линия:

 
printf "%s",$realSense; 

не имеет какую-либо конкретную ширины, и сбросив выравнивание.

Смежные вопросы