在 perl 正则表达式替换中,如何删除列表元素的前导空格?

In perl regex replacements, how to remove leading whitespace for list elements?

我使用 Perl 正则表达式搜索特定模式,并紧接着添加一些新内容。添加的东西是一个列表,正如通常预期的那样,我希望列表的每个元素在输出中占据一行。我的代码是这样的:

push(@happy_list, "e\n");
push(@happy_list, "f\n");
push(@happy_list, "g\n");
push(@happy_list, "h\n");

$_ = "aaa\nfoo\nbbb";
$_ =~ s/(aaa.*?bbb)/\n@happy_list/sg;
print;

输出结果为:

aaa
foo
bbb
e
 f
 g
 h

在输出中,列表的每个元素的开头都有一个白色的space,就在列表元素的前面。挺好的,就是有点丑。有什么方便的技巧可以删除多余的 space?

这是因为数组在字符串上下文中使用,所以默认分隔符是 space。

您可以通过在替换之前执行 $" = ''; 来更改此设置。

$_ = "aaa\nfoo\nbbb";
$" = ''; #"for syntax highlighting
$_ =~ s/(aaa.*?bbb)/\n@happy_list/sg;
print;

您还可以这样做:

$_ = "aaa\nfoo\nbbb";
my $str = join('', @happy_list);
$_ =~ s/(aaa.*?bbb)/\n$str/sg;
print;

你试过trim吗?

$_ =~ s/^\s+//;

首先-我建议不要那样使用$_。它是 perl 中的保留变量,用作循环迭代器。作为循环操作的一部分,有时需要修改它,但是将它设置为 print; 语句的 shorthand 是不好的风格。

这个问题的根源在于对数组进行字符串化——无论如何,您实际上不需要在这里做这件事。

#!/usr/bin/env perl

use strict;
use warnings;

my @happy_list;

push(@happy_list, "e\n");
push(@happy_list, "f\n");
push(@happy_list, "g\n");
push(@happy_list, "h\n");

my @new_list; 
push ( @new_list, "aaa\n", "foo\n", "bbb\n" ); 
print @new_list, @happy_list;

不过,我可能建议不要添加换行符,而是:

#!/usr/bin/env perl

use strict;
use warnings;

my @happy_list;

push(@happy_list, "e");
push(@happy_list, "f");
push(@happy_list, "g");
push(@happy_list, "h");

my @new_list; 
push ( @new_list, "aaa", "foo", "bbb" ); 
print join "\n", @new_list, @happy_list;