我们有代码,其中输入可以是单值或逗号分隔值。我们需要删除每个值之前和之后的任何空格。
我们正在做如下:
my @var_1 = split /,/,$var;
print "print_1 : @var_1 \n ";
@var_1 = grep {s/^\s+|\s+$//g; $_ } @var_1;
print "print_2 : @var_1 \n ";
$ var将包含输入值。如果$ var为0,则print_1为打印值0但print_2不打印任何内容。我们的要求只是删除值0之前和之后的空格。但是如果$ var为1,则print(print_1和print_2)都正确打印值1.如果我们将输入设为1,0则删除0并打印值1在print_2。
我不确定为什么它会删除值0.是否可以对替换运算符进行任何更正,以便不删除值0?
提前致谢!!!
答案 0 :(得分:3)
在Perl中,只有少数不同的值为 false 。这些主要是
undef
0
0
0
0
""
您已获得空字符串变体0
。
@var_1 = grep {s/^\s+|\s+$//g; $_ } @var_1;
此代码有三种方式:
$_
被清理并变为foo
。我们希望它通过。$_
被清理并变为0
。我们希望它通过。$_
被清理并变为空字符串""
。我们希望它失败。但是会发生什么是因为0
是假的,而grep
只有在其块中的最后一个语句为真时才通过它。这就是我们想要的空字符串""
,而不是0
。
@var_1 = grep {s/^\s+|\s+$//g; $_ ne "" } @var_1;
现在我们明确检查清理后的值不是空字符串""
,允许零0
。
这是一个带有清理变量名称的完整版本(命名很重要!)。
my $input = q{foo, bar, 1 23 ,,0};
my @values = split /,/,$input;
print "print_1 : @values \n ";
@values = grep {s/^\s+|\s+$//g; $_ ne q{} } @values;
print "print_2 : @values \n ";
输出结果为:
print_1 : foo bar 1 23 0
print_2 : foo bar 1 23 0
请注意,您的grep
不是最佳解决方案。与往常一样,Perl中的there is more than one way to do it。 for
循环Сухой27 suggests in their answer更简洁,我会继续使用。
答案 1 :(得分:2)
你想要
@var_1 = map { my $v = s/^\s+|\s+$//gr; length($v) ? $v : () } @var_1
代替,
@var_1 = grep {s/^\s+|\s+$//g; $_ } @var_1;
grep
用于过滤列表元素,并过滤所有错误值(包括''
,0
和undef
)
答案 2 :(得分:2)
如果你想在逗号上拆分并从每个结果字符串中删除前导和尾随空格,那么这很可能会转化为代码:
my @var = map s/^\s+|\s+\z//gr, split /,/, $var, -1;
/r
使s///
返回替换结果(需要perl 5.14+)。需要在分割上-1
以防止忽略尾随的空字段。
如果没有零长度条目(所以不是例如a,,b
),你可以直接从字符串中提取你想要的东西(非空白的逗号序列,不用空格开头或结尾)而不是先拆分它:
@var = $var =~ /(?!\s)[^,]+(?<!\s)/g;
答案 3 :(得分:1)
我建议使用map
使用正则表达式从第一个到最后一个非空格字符匹配来清理数组
也无需单独进行split
操作
喜欢这个
my @var_1 = map { / ( \S (?: .* \S )? ) /x } split /,/, $var;
请注意,此方法会删除空字段。目前还不清楚是否需要这样做
答案 4 :(得分:0)
您也可以使用
@values = map {$_ =~ s/^\s+|\s+$//gr } @values;
或更简洁
@values = map {s/^\s+|\s+$//gr } @values;
删除数组中的空格
不要忘记r
因为它是非破坏性的选项,否则你将用空格的出现次数替换你的字符串。
这说它只有在使用Perl 5.14或更高版本时才有效, 这里有一些文件;) https://www.perl.com/pub/2011/05/new-features-of-perl-514-non-destructive-substitution.html
我认为这个synthax更容易理解,因为它更接近“通常”替换方法。