【问题标题】:Perl remove spaces from array elementsPerl 从数组元素中删除空格
【发布时间】:2020-04-27 14:11:14
【问题描述】:

我有一个包含n 元素数量的数组。因此,每个元素都有可能在开头或结尾有空格。所以我想一次性删除空间。这是我的代码 sn-p 正在工作和不工作的代码(不工作的代码能够在最后修剪但不能从元素的正面修剪)。

不工作:

....
use Data::Dumper;

my @a = ("String1", " String2 ", "String3 ");

print Dumper(\@a);

@a = map{ (s/\s*$//)&&$_}@a;

print Dumper(\@a);
...

工作:

...
use Data::Dumper;

my @a = ("String1", " String2 ", "String3 ");

print Dumper(\@a);

my @b = trim_spaces(@a);

print Dumper(\@b);

sub trim_spaces
{
    my @strings = @_;
    s/\s+//g for @strings;
    return @strings;
}
...

不知道这两者有什么区别。

如果有更好的请分享给我!!

【问题讨论】:

  • @toolic,我不想删除字符串中间的空格。

标签: arrays perl


【解决方案1】:

您的“不工作示例”仅从字符串的一端删除空格。 表达式s/^\s+|\s+$//g 将删除两端的空格。

您可以通过使用/r 标志返回修改后的副本来改进您的代码:

@a = map { s/^\s+|\s+$//gr } @a;

或者,如果你必须:

@a = map { s/^\s+|\s+$//g; $_ } @a;

【讨论】:

  • 请注意,在不使用/r的版本中,分配回@a实际上是多余的,因为@a将被就地修改。
  • @a = map { s/^\s+|\s+$//g; $_ } @a; 没有意义。如果删除多余的语句,您会得到map { s/^\s+|\s+$//g } @a;,最好写成s/^\s+|\s+$//g for @a;。我想你会选择@a = map { (my $s = $_) =~ s/^\s+|\s+$//g; $s } @a;
  • 不能直接使用 s/// 的返回值,因为它是执行的替换次数。因此 ; $_ 再次返回 $_ 。当然, r 标志是迄今为止更好的解决方案。或者确实是 for 循环,但有时这意味着存储到中间变量中。
【解决方案2】:

这个块有两个问题:

{ (s/\s*$//)&& $_ }

一个小问题是它只删除尾随空格,而不是前导空格,你说你也想删除它。

更隐蔽的问题是&& 的误导性使用。如果s/// 中的正则表达式找不到匹配项,则返回undef;在&& 的左侧,意味着永远不会执行右侧,undef 成为整个块的值。这意味着任何正则表达式不匹配的字符串都将被删除并替换为map 返回的结果数组中的undef,这可能不是您想要的。

您编写的正则表达式实际上不会发生这种情况,因为每个字符串都匹配\s*,并且s/// 即使它实际上没有修改字符串,仍然返回true。但这取决于正则表达式和一个不好的假设。

更一般地说,您的方法混合并匹配了两种不兼容的数据修改方法:原地变异 (s///) 与创建应用了一些更改的副本 (map)。

map 函数旨在创建一个新数组,其元素以某种方式基于输入数组;理想情况下,它不应在此过程中修改原始数组。但是您的代码确实如此 - 即使您没有将 map 的结果分配回 @as/// 也会修改 @a 中的字符串。事实上,您可以从代码中删除 @a = 并获得相同的结果。这不是好的做法; map 应该用于它的返回值,而不是它的副作用。

如果您想就地修改数组的元素,您的for 解决方案实际上是要走的路。它可以清楚地说明您在做什么,并且副作用还可以。

如果您想保留原始数组并创建一个应用了更改的新数组,您应该在替换上使用/r 标志,这会导致它们返回结果字符串而不是修改原始字符串:

my @b = map { s/^\s+|\s+$//gr } @a;

这会留下@a,并使用修剪后的字符串创建一个新数组@b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2018-08-06
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多