在Perl中,删除空间的替换运算符在删除空格时删除值0

时间:2017-11-30 07:07:00

标签: perl

我们有代码,其中输入可以是单值或逗号分隔值。我们需要删除每个值之前和之后的任何空格。

我们正在做如下:

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?

提前致谢!!!

5 个答案:

答案 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 itfor循环Сухой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用于过滤列表元素,并过滤所有错误值(包括''0undef

答案 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更容易理解,因为它更接近“通常”替换方法。