【问题标题】:Perl: Perl6::Form formatPerl: Perl6::Form 格式
【发布时间】:2020-09-22 05:55:14
【问题描述】:

我有这样的文件,

SR   Name               Rollno   Class

1    Sanjay              01       B
2    Rahul_Kumar_Khanna  09       A

现在我需要添加“|”之间。所以它应该看起来像

SR | Name              |Rollno | Class|

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

我正在使用 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;
}

到目前为止,我已经完成了,但是名称没有正确显示。我添加了额外的“|”名义上。有什么办法可以加“|”通过计算长度(如下)。我试过了,但出错了。

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

【问题讨论】:

  • 你怎么知道“Rahul Kumar”是一个字段(而不是两个字段)?如果你在空间上分割(就像你一样),它将变成两个字段..
  • @HåkonHægland 好的,现在检查。现在它将进入一个领域。我的问题是,如果将来我需要添加比现有名称更大的其他名称,那么我必须添加额外的“|”这样名字就不会被删掉了。
  • @HG: 比现有名称更大的名称 如果更大的名称用空格分隔,那么逻辑 (split (" ", $line)) 将无法按照我的预期工作相信。
  • @vkk05 我尝试使用比 "Rahul_Kumar_Khanna" 更大的名字,但我面临的问题是我需要增加 "|"的第 2 列,这样全名就不会被删减。拆分工作正常。
  • @HG 您可以先扫描文件作为预处理步骤以找到名称字段的最大长度,然后使用最大长度再次遍历行以格式化名称字段..

标签: forms perl split


【解决方案1】:

问题 #1

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

生产

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

但你想得到

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

为此,你会想要

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

问题 #2

$len 是当前行的名称字段的长度。每一行都不一样。这是错误的,因为您希望每行的输出宽度相同。 $len 需要是最长名称字段的长度。

在开始循环之前,您需要找到$len 的正确值。

# 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";
   }
}

【讨论】:

  • 忘了说你可以用同样的方法创建一个sprintf 模式
  • 你能解释一下问题#2吗?或在代码中添加 cmets ?谢谢。
  • 嗯,你需要 name 列的最大宽度,所以它会找到。实际上,它获得了每列的最大宽度。已添加评论。
  • 你能检查一下这个问题吗[stackoverflow.com/questions/64121838/…
猜你喜欢
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2013-12-30
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多