使用perl在变量中添加新行

时间:2018-05-28 23:43:23

标签: perl

我试图在一定数量的单词之后在变量中添加一个新行。例如:如果我们有一个变量:

$x = "This a variable, start a new line here, This is a new line.";

如果我打印上面的变量

print $x; 

我应该得到以下输出:

This is a variable,  
start a new line here,  
This is a new line.

如何从变量本身在Perl中实现这一点?

3 个答案:

答案 0 :(得分:0)

我不同意“在一定数量的词之后”的公式。 请注意,第一个目标行有4个字,而其余2个有 每个5个字。

实际上你需要替换每个逗号并遵循以下顺序 空格(如果有),逗号和\n

所以直观的方法是:

$x =~ s/,\s*/,\n/g;

答案 1 :(得分:0)

最简单的方法是将字符串拆分为comma followed by a space然后 使用comma followed by a newline加入单词组。

my $x = "This a variable, start a new line here, This is a new line.";

print join(",\n", split /, /, $x) . "\n";

<强>输出

This a variable,
start a new line here,
This is a new line.

要解决一般how do I reformat this string with line breaks after n-columns?问题,请使用Text::Wrap库(由@ikegami建议):

use Text::Wrap;

my $x = "The quick brown fox jumped over the lazy dog.";

$Text::Wrap::columns = 15;

# wrap() needs an array of words
my @words = split /\s+/, $x;

# Initial tab, subsequent tab values set to '' (think indent amount)
print wrap('', '', @words) . "\n";

<强>输出

The quick
brown fox
jumped over
the lazy dog.

答案 2 :(得分:-1)

您可能想要使用正则表达式。你可以这样做:

$x =~ s/^(\S+\s+){3}\K/\n/;

或者如果这是关于逗号而不是空格:

$x =~ s/^([^,]+,+){2}\s*\K/\n/;

(在这种情况下,我还删除了逗号之后的任何可能空格)

您还可以通过将其添加到变量中来单独配置所需的单词或逗号:

my $nbwords = 7; # add a line after the 7th word
$x =~ s/^(\S+\s+){$nbwords}\K/\n/;

现在,这将保留最后一个空格,因此您可能希望这样做:

my $nbwords = 7; # add a line after the 7th word
$nbwords--; # becomes 6 because there is another word after that we match as well
$x =~ s/^(\S+\s+){$nbwords}\S+\K\s+/\n/;

您应该学会使用Regexps,但只是为了解释上述内容:

  • \ s是任何空格字符(如空格,制表符,换行符等)
  • \ S(大写)是除空格字符外的任何字符
  • +表示使用之前的内容描述的任何数量的字符。所以\ s +表示任意数量的连续空格字符。
  • {123}表示该类型字符的123次...
  • {3,80}表示3至80次。所以+相当于{1,}(一到无限)
  • \ K意味着以前的任何内容都不会被替换,只会替换之后的内容。