我正在编写一个协议,取消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.发布于 2021-04-28 10:06:29
根据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.https://stackoverflow.com/questions/67282953
复制相似问题