首页 > 解决方案 > 使用格式处理器按需打印一行,其中没有变量

问题描述

我正在编写一个取消 perl 格式处理器的协议。

所以我有一个格式

format err_spooler_line =
@#### | Error: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$error_spooler_line, $error_spooler_text_short
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_short
# --> This line should only displayed, when $error_spooler_text_long is set.
      | Details:
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_long
.

作为解决方法,我使用:

format err_spooler_line =
@#### | Error: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$error_spooler_line, $error_spooler_text_short
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_short
# --> This line should only displayed, when $error_spooler_text_long is set.
# So it is working, but it writes some text of the description in the line
~     | Details: ^<
                 $error_spooler_text_long
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_long
.

如果我用它开始我的描述测试\n$error_spooler_text_long = "\n" . $error_spooler_text_long. 所以在“详细信息”之后有一个换行符,下一行从下一个图片行开始。

但是我怎样才能自动做到这一点?这样就不需要在我的字符串前面加上\n.

一个完整的例子:

#!usr/bin/perl
use strict;

# Variables used in the format
my $error_spooler_line;
my $error_spooler_text_short;
my $error_spooler_text_long;

format err_spooler_top =
Protocol: - DATA-Error                              Page: @###
                                                          $%
--------------------------------------------------------------
.

format err_spooler_line  =
@#### | Error: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$error_spooler_line, $error_spooler_text_short
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                     $error_spooler_text_short
      | Details:
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_long
.

# The whole protocol is written into a string.
my $error_file_string = "";
open my $hnd_spooler, ">", \$error_file_string;

select((select($hnd_spooler),
        $~ = "err_spooler_line",
        $^ = "err_spooler_top"
       )[0]);
       
    
while(<DATA>) {
    chomp;

    $error_spooler_line = $.;
    ($error_spooler_text_short, $error_spooler_text_long) = split (/;/);
    write $hnd_spooler;   
}

close ($hnd_spooler);

## Now, all the protocol is in $error_file_string !
print $error_file_string;

__DATA__
ERR_ID_0   OK;
ERR_ID_278 UPDATE Failed;Update failed cause of DB connection error\nDB error number: 22.
ERR_ID_0   OK;
ERR_ID_33  Invalid data format;Only numbers allowed.

那么输出是:

Protocol: - DATA-Error                              Page:    1
--------------------------------------------------------------
    1 | Error: ERR_ID_0   OK
      | Details:
    2 | Error: ERR_ID_278 UPDATE Failed
      | Details:
      | Update failed cause of DB connection error\nDB error
      | number: 22.
    3 | Error: ERR_ID_0   OK
      | Details:
    4 | Error: ERR_ID_33  Invalid data format
      | Details:
      | Only numbers allowed.

但我想要“详细信息:”行只有它有详细信息:

Protocol: - DATA-Error                              Page:    1
--------------------------------------------------------------
    1 | Error: ERR_ID_0   OK
    2 | Error: ERR_ID_278 UPDATE Failed
      | Details:
      | Update failed cause of DB connection error
      | DB error number: 22.
    3 | Error: ERR_ID_0   OK
    4 | Error: ERR_ID_33  Invalid data format
      | Details:
      | Only numbers allowed.

标签: perlformat

解决方案


根据perlform

使用插入符号字段可以生成所有字段为空白的行。您可以通过在行中的任何位置放置“~”(波浪号)字符来抑制此类行。波浪号将在输出时转换为空格。

以下似乎有效:

use strict;
use warnings;
my $error_spooler_line ;
my $error_spooler_text_short;
my $error_spooler_text_long;

format err_spooler =
@#### | Error: ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$error_spooler_line, $error_spooler_text_short
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_short
~     | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@{[(length $error_spooler_text_long) ? "Details:" : ""]}
~~    | ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
        $error_spooler_text_long
.

select (STDOUT);
$~ = "err_spooler";
while(<DATA>) {
    chomp;
    $error_spooler_line = $.;
    ($error_spooler_text_short, $error_spooler_text_long) = split /;/;
    write;
}


__DATA__
ERR_ID_0   OK;
ERR_ID_278 UPDATE Failed;Update failed cause of DB connection error, DB error number: 22.
ERR_ID_0   OK;
ERR_ID_33  Invalid data format;Only numbers allowed.

输出

1 | Error: ERR_ID_0   OK
2 | Error: ERR_ID_278 UPDATE Failed
  | Details:
  | Update failed cause of DB connection error, DB error number: 22.
3 | Error: ERR_ID_0   OK
4 | Error: ERR_ID_33  Invalid data format
  | Details:
  | Only numbers allowed.

推荐阅读