首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用格式处理器按需打印一行,其中没有变量。

使用格式处理器按需打印一行,其中没有变量。
EN

Stack Overflow用户
提问于 2021-04-27 12:21:44
回答 1查看 56关注 0票数 1

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

所以我有一种格式

代码语言:javascript
复制
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
.

作为的解决方案,我使用

代码语言:javascript
复制
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

一个完整的例子:

代码语言:javascript
复制
#!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.

然后,产出如下:

代码语言:javascript
复制
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.

但是我想有“细节:”行只有它有细节:

代码语言:javascript
复制
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.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 10:06:29

根据perlform

使用插入符号字段可以生成所有字段都为空白的行。您可以通过在行的任何位置放置"~“(倾斜)字符来抑制这类行。在输出时,倾斜度将被转换成一个空格。

以下几点似乎有效:

代码语言:javascript
复制
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.

输出

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67282953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档