Perl: Perl6::Form format

末鹿安然 提交于 2021-01-28 07:03:59

问题


I have file something like this,

SR   Name               Rollno   Class

1    Sanjay              01       B
2    Rahul_Kumar_Khanna  09       A

Now I need to add "|" between each. So it should look like

SR | Name              |Rollno | Class|

1  | Sanjay            |01     | B    |
2  | Rahul_Kumar_Khanna|09     | A    |

I am using Perl6::form

my $text;
        
foreach my $line (@arr) {
    my ($SR, $Name, $Rollno, $Class) = split (" ", $line);
    my $len = length $Name;
    $text = form 
        '| {||||||||} | {||||||||} | {||||||||} | {||||||||}|', 
            $SR,         $Name,       $Rollno,     $Class;
    print $text;
}

Here till now I have done but the name is not comming out properly. I have add extra "|" in name for that. Is there any way we can add "|" by calculating length like(below). I tried but getting error.

'| {||||||||} | {||||||||}x$len | {||||||||} | {||||||||}|',

回答1:


Problem #1

'| {||||||||} | {||||||||}x$len | {||||||||} | {||||||||}|'

produces

| {||||||||} | {||||||||}x20 | {||||||||} | {||||||||}|

but you're trying to get

| {||||||||} | {||||||||||||||||||||} | {||||||||} | {||||||||}|

For that, you'd want

'| {||||||||} | {'.( "|" x $len ).'} | {||||||||} | {||||||||}|'

Problem #2

$len is the length of the name field of the current row. It's different for every row. This is wrong, cause you want the output to be the same width for every row. $len needs to be the length of the longest name field.

You will need to find the correct value for $len before even starting the loop.

# Read in the data as an array of rows.
# Each row is an array of values. 
my @rows = map { [ split ] } <>;

# Find the maximum width of each column. 
my @col_lens = (0) x @{rows[0]};
for my $row (@rows) {
   # Skip the blank line after the header. 
   next if !@$row;

   for my $col_idx (0..$#$row) {
      my $col_len = $row->[$col_idx];
      if ($col_lens->[$col_idx] < $col_len) {
         $col_lens->[$col_idx] = $col_len;
      }
   }
}

my $form =
   join "",
      "| ",
      "{".( "|"x($col_lens[0]-2) )."}",
      " | ",
      "{".( "|"x($col_lens[1]-2) )."}",
      " | ",
      "{".( "|"x($col_lens[2]-2) )."}",
      " | ",
      "{".( "|"x($col_lens[3]-2) )."}",
      " |";

for my $row (@rows) {
   if (@$row) {
      print form($form, @$row);
   } else {
      print "\n";
   }
}


来源:https://stackoverflow.com/questions/64003805/perl-perl6form-format

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!