PERL:使用Text::Wrap并指定行的结尾

PERL:使用Text::Wrap并指定行的结尾,perl,word-wrap,Perl,Word Wrap,是的,我在写考克斯说: #!/usr/bin/perl use Text::Wrap; $Text::Wrap::columns = 40; my $FORTUNE = "The very long sentence that will be outputted by another command and it can be very long so it is word-wrapped The very long sentence that will be outputted by an

是的,我在写考克斯说:

#!/usr/bin/perl

use Text::Wrap;
$Text::Wrap::columns = 40;

my $FORTUNE = "The very long sentence that will be outputted by another command and it can be very long so it is word-wrapped The very long sentence that will be outputted by another command and it can be very long so it is word-wrapped";

my $TOP = " _______________________________________
/                                       \\
";
my $BOTTOM = "\\_______________________________________/
";

print $TOP;
print wrap('| ', '| ', $FORTUNE) . "\n";
print $BOTTOM;
产生这个

 _______________________________________
/                                       \
| The very long sentence that will be
| outputted by another command and it
| can be very long so it is
| word-wrapped The very long sentence
| that will be outputted by another
| command and it can be very long so it
| is word-wrapped
\_______________________________________/
我怎么能得到这个

 _______________________________________
/                                       \
| The very long sentence that will be   |
| outputted by another command and it   |
| can be very long so it is             |
| word-wrapped The very long sentence   |
| that will be outputted by another     |
| command and it can be very long so it |
| is word-wrapped                       |
\_______________________________________/

我在文档中找不到方法,但是如果保存字符串,您可以应用一个小技巧。可以使用包变量指定新行结尾:

$Text::Wrap::separator = "|$/";
您还需要防止模块展开制表符并干扰字符计数:

$Text::Wrap::unexpand = 0;
这只是一个管道|,后跟输入记录分隔符$/换行符。这将在管线末端添加管道,但没有填充空间,必须手动添加填充空间:

my $text = wrap('| ', '| ', $FORTUNE) . "\n";
$text =~ s/(^.+)\K\|/' ' x ($Text::Wrap::columns - length($1)) . '|'/gem;
print $text;
这将匹配每行的开头,以|结尾,通过将空格乘以列减去匹配字符串的长度来添加填充空间。我们使用/m修饰符使“^匹配字符串中的换行符..+它本身不会匹配换行符,这意味着每个匹配项都是一整行。/e修饰符将以代码而不是字符串的形式评估替换部件


请注意,这是一种快速破解,因此可能会出现bug。

我在文档中找不到方法,但如果保存字符串,您可以应用一个小破解。可以使用包变量指定新行结尾:

$Text::Wrap::separator = "|$/";
您还需要防止模块展开制表符并干扰字符计数:

$Text::Wrap::unexpand = 0;
这只是一个管道|,后跟输入记录分隔符$/换行符。这将在管线末端添加管道,但没有填充空间,必须手动添加填充空间:

my $text = wrap('| ', '| ', $FORTUNE) . "\n";
$text =~ s/(^.+)\K\|/' ' x ($Text::Wrap::columns - length($1)) . '|'/gem;
print $text;
这将匹配每行的开头,以|结尾,通过将空格乘以列减去匹配字符串的长度来添加填充空间。我们使用/m修饰符使“^匹配字符串中的换行符..+它本身不会匹配换行符,这意味着每个匹配项都是一整行。/e修饰符将以代码而不是字符串的形式评估替换部件


请注意,这是一种快速攻击,因此可能会出现bug。

如果您愿意下载更强大的模块,可以使用。它有更多的自定义选项,但最相关的选项是rightFill,它用空格填充每行中的其余列

不幸的是,您无法使用非空格字符自定义左侧和右侧。您可以通过执行正则表达式替换来使用变通方法,就像在其源代码中一样

#!/usr/bin/env perl

use utf8;
use Text::Format;

chop(my $FORTUNE = "The very long sentence that will be outputted by another command and it can be very long so it is word-wrapped " x 2);

my $TOP =  "/" . '‾'x39 . "\\\n";
my $BOTTOM = "\\_______________________________________/\n";

my $formatter = Text::Format->new({ columns => 37, firstIndent => 0, rightFill => 1 });
my $text = $formatter->format($FORTUNE);
$text =~ s/^/| /mg;
$text =~ s/\n/ |\n/mg;

print $TOP;
print $text;
print $BOTTOM;

如果您愿意下载更强大的模块,可以使用。它有更多的自定义选项,但最相关的选项是rightFill,它用空格填充每行中的其余列

不幸的是,您无法使用非空格字符自定义左侧和右侧。您可以通过执行正则表达式替换来使用变通方法,就像在其源代码中一样

#!/usr/bin/env perl

use utf8;
use Text::Format;

chop(my $FORTUNE = "The very long sentence that will be outputted by another command and it can be very long so it is word-wrapped " x 2);

my $TOP =  "/" . '‾'x39 . "\\\n";
my $BOTTOM = "\\_______________________________________/\n";

my $formatter = Text::Format->new({ columns => 37, firstIndent => 0, rightFill => 1 });
my $text = $formatter->format($FORTUNE);
$text =~ s/^/| /mg;
$text =~ s/\n/ |\n/mg;

print $TOP;
print $text;
print $BOTTOM;

谢谢TLP;我不能让它工作,我得到了相同的结果,没有预期的尾管,可能是因为我不明白1美元是从哪里来的?哦,对了,我忘了一部分。。。我要补充一点。不,$1是由括号捕获的字符串^.+。太好了:差不多了。它可以工作,但以缩进的空格开头的行的|结尾将被空格数禁用。非常感谢您的帮助,TLP。当您有足够的空间时,模块似乎会自动插入选项卡。一个标签的长度计算也不一样。也许有一种方法可以覆盖它,似乎unexpand变量可以解决这个问题。不幸的是,它也删除了现有的标签,但你不能拥有所有;我不能让它工作,我得到了相同的结果,没有预期的尾管,可能是因为我不明白1美元是从哪里来的?哦,对了,我忘了一部分。。。我要补充一点。不,$1是由括号捕获的字符串^.+。太好了:差不多了。它可以工作,但以缩进的空格开头的行的|结尾将被空格数禁用。非常感谢您的帮助,TLP。当您有足够的空间时,模块似乎会自动插入选项卡。一个标签的长度计算也不一样。也许有一种方法可以覆盖它,似乎unexpand变量可以解决这个问题。不幸的是,它还删除了现有的选项卡,但您不能拥有所有选项卡。