Perl:如何格式化包含波浪字符“~”的字符串

Perl: how to format a string containing a tilde character "~"

我 运行 遇到一个问题,我们用来解析文本文件的 perl 脚本忽略了包含波浪号 (~) 字符的行,我不知道为什么。

下面的示例说明了我的意思:

#!/usr/bin/perl
use warnings;

formline "  testing1\n";
formline " ~testing2\n";
formline "  testing3\n";

my $body_text = $^A;
$^A = "";

print $body_text

这个例子的输出是:

testing1
testing3

包含波浪号的行完全从累加器中删除。无论字符前面是否有任何文本,都会发生这种情况。

有什么方法可以打印波浪号作为字符串文字部分的行吗?

~在形式上比较特殊(见perlform),没办法转义。但是您可以为它创建一个字段并用波浪号填充它:

formline " \@testing2\n", '~';

formline 的第一个参数是“图片”(模板)。那张照片使用各种字符来表示特定的事物。 ~ 表示如果字段为空则抑制输出。由于您在调用 formline 时未提供任何字段,因此您的字段为空并且输出被抑制。

my @lines = ( '', 'x y z', 'x~y~z' );

foreach $line ( @lines ) { # forms don't use lexicals, so no my on control
    write;
    }

format STDOUT =
~ ID: @*
$line
.

输出没有一行空白字段,因为图片中的 ~ 告诉它在 $line 没有任何内容时抑制输出:

  ID: x y z
  ID: x~y~z

请注意,来自数据的波浪线很好;他们和其他角色一样。

这可能更接近您的意思。创建图片,@*(variable-width 多行文本),并为其提供填充值:

while( <DATA> ) {
    local $^A;
    formline '@*', $_;
    print $^A, "\n";
    }

__DATA__
  testing1
 ~testing2
  testing3

输出显示带有 ~ 的字段:

  testing1
 ~testing2
  testing3

但是,这个问题很奇怪,因为你做事的方式似乎并没有真正做格式想要做的事情。也许您在尝试从输入数据中获取图片时遇到了一些棘手的事情。但是如果你不打算给它任何值,你真正格式化的是什么?考虑到您实际上可能不需要格式。